之前在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则是本书中配套的头文件

其链接如下:tpn/cuda-by-example: Code for NVIDIA's CUDA By Example Book. (github.com)icon-default.png?t=O83Ahttps://github.com/tpn/cuda-by-example

下载完成后解压得到 cuda-by-example-master文件夹

进入cu项目的文件目录

将其复制到该目录下

配置链接器的附加依赖项

附加依赖项中添加glut64.lib的地址(相对于项目的地址也可以,这里为了方便直接拿到了绝对地址)

运行代码,就可以看到美丽的julia集了

#在一步步配置环境的过程中遇到了很多奇怪的错误,不过也是遇水架桥,逢山开路,总算是有了一个可靠的cuda开发环境。

#参考资料:VS2019--c++CUDA环境配置与编程实例 - 知乎 (zhihu.com)

Logo

欢迎来到由智源人工智能研究院发起的Triton中文社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐