在visual studio上配置cuda运行环境,并实现Julia集
Julia 集是通过以下递归公式生成的:z 是一个复数,表示平面上的点。c 是一个固定的复常数。n 是迭代次数。在这个公式中,从一个初始值 z0z_0z0 开始,不断迭代计算新的值 Zn+1。Julia 集的定义取决于这些点在经过无穷次迭代后是否会逃离到无穷大。如果在无限次迭代后,∣Zn∣ 仍然保持有限,那么这个点 Z0 就属于 Julia 集。如果 ∣Zn∣ 趋向无穷大,那么这个点 Z0
之前在vscode上配置好环境后,发现cl编译器的错误提示总是出现乱码,经过各种尝试后无果,于是索性换回vs。
#cs新手,如有错误烦请大佬们指正!!!
一.配置vs环境
1.新建项目
2.添加include文件
右键---属性---VC++目录---包含目录---添加cuda的include
3.添加lib文件
同一属性页中
编译库目录
4.添加lib的链接
同一属性页下---链接器---常规---附加依赖项
5.生成依赖项
勾选cuda选项
注:如果这里没有cuda选项,则尝试重新安装cuda。
6.cuda工具目录
属性页---cudaC/C++---common---CUDA Toolkkit Custom Dir---输入cuda所在路径
二、实现julia集
Julia 集(Julia Set)是由法国数学家加斯顿·朱利亚(Gaston Julia)在20世纪初研究的一个分形图形。它是复数平面上的一种特殊的点集,通过迭代一个简单的数学公式生成,具有非常复杂和美丽的图形结构。
数学定义
Julia 集是通过以下递归公式生成的: 其中:
- z 是一个复数,表示平面上的点。
- c 是一个固定的复常数。
- n 是迭代次数。
在这个公式中,从一个初始值 z0z_0z0 开始,不断迭代计算新的值 Zn+1。Julia 集的定义取决于这些点在经过无穷次迭代后是否会逃离到无穷大。
- 如果在无限次迭代后,∣Zn∣ 仍然保持有限,那么这个点 Z0 就属于 Julia 集。
- 如果 ∣Zn∣ 趋向无穷大,那么这个点 Z0 就不属于 Julia 集。
#include "cuda-by-example-master\common\book.h"
#include "cuda-by-example-master\common\cpu_bitmap.h"
#include <device_launch_parameters.h>
#define DIM 1000
struct cuComplex
{
float r;
float i;
__device__ cuComplex(float a, float b) : r(a), i(b) {}
__device__ float magnitude2()
{
return r * r + i * i;
}
__device__ cuComplex operator*(const cuComplex& a)
{
return cuComplex(r * a.r - i * a.i, i * a.r + r * a.i);
}
__device__ cuComplex operator+(const cuComplex& a)
{
return cuComplex(r + a.r, i + a.i);
}
};
__device__ int julia(int x, int y)
{
const float scale = 1.5;
float jx = scale * (float)(DIM / 2 - x) / (DIM / 2);
float jy = scale * (float)(DIM / 2 - y) / (DIM / 2);
cuComplex c(-0.8, 0.156);
cuComplex a(jx, jy);
int i = 0;
for (i = 0; i < 200; i++)
{
a = a * a + c;
if (a.magnitude2() > 1000)
return 0;
}
return 1;
}
__global__ void kernel(unsigned char* ptr)
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
int juliaValue = julia(x, y);
ptr[offset * 4 + 0] = 255 * juliaValue;
ptr[offset * 4 + 1] = 0;
ptr[offset * 4 + 2] = 0;
ptr[offset * 4 + 3] = 255;
}
int main()
{
CPUBitmap bitmap(DIM, DIM);
unsigned char* dev_bitmap;
HANDLE_ERROR(cudaMalloc((void**)&dev_bitmap, bitmap.image_size()));
dim3 grid(DIM, DIM);
kernel << <grid, 1 >> > (dev_bitmap);
HANDLE_ERROR(cudaMemcpy(bitmap.get_ptr(), dev_bitmap, bitmap.image_size(), cudaMemcpyDeviceToHost));
bitmap.display_and_exit();
HANDLE_ERROR(cudaFree(dev_bitmap));
}
这个例子来源于CUDA-BY-EXAMPLE这本书,而book.h和cpu_bitmap.h则是本书中配套的头文件
下载完成后解压得到 cuda-by-example-master文件夹
进入cu项目的文件目录
将其复制到该目录下
配置链接器的附加依赖项
附加依赖项中添加glut64.lib的地址(相对于项目的地址也可以,这里为了方便直接拿到了绝对地址)
运行代码,就可以看到美丽的julia集了
#在一步步配置环境的过程中遇到了很多奇怪的错误,不过也是遇水架桥,逢山开路,总算是有了一个可靠的cuda开发环境。
欢迎来到由智源人工智能研究院发起的Triton中文社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。
更多推荐
所有评论(0)