CUDA+VS2017+win环境下 cuda工程环境搭建
引言
在学习CUDA并行计算原理时,在VS下新建了一个CUDA工程,但是对加载函数定义中的一些CUDA标识符无法正常识别。错误如下:
__device__ 错误:该符号未定义
这个标识符的作用是声明函数从设备端调用并在设备端执行
前提准备(CUDA和VS的安装)
-
Visual Studio(如果确定CUDA和VS安装正确,可以直接转到到Visual Studio配置。) :首先安装VS必要组件(C++桌面程序)
-
CUDA 在 NVIDIA官网链接(此处是CUDA11.0)上下载符合自己显卡且所需版本的CUDA安装,安装后需要配置环境变量,这个网上教程很多,不再赘述。
安装完成后,记得使用测试程序测试一下是否正确安装。
Visual Studio 配置
-
创建CUDA工程:打开vs,创建新项目,选择CUDA项目,填写项目名称和选择路径。如上图所示。
-
增加包含目录
右键项目属性->VC++目录->包含目录,将安装好CUDA中include加入包含目录中,将下方这两个路径加入。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\common\inc -
增加项目扩展名
点击上方菜单栏工具=>选项=>文本编辑器=>文件扩展名,在扩展名栏中输入.cu,并选择编辑器为:Microsoft Visual C++。
5.工具–>选项–>项目和解决方案–>VC++项目设置,添加要包括的扩展名".cu"
6. 右键打开的项目–>生成依赖项–>生成自定义–>勾选CUDA v11.0
测试
测试案例来自: [CUDA高性能并行计算链接]第三章中项目dist_v1_cuda
下面展示一些 案例代码
。
// An highlighted block
#include<stdio.h>
#include<iostream>
#define N 64
#define TPB 32
__device__ float scale(int n, int i) {
return((float)i) / (n - 1);
}
__device__ float distance(float x1, float x2) {
return sqrt((x2 - x1)*(x2 - x1));
}
__global__ void distanceKernel(float *d_out,float ref,int len)
{
const int i = blockIdx.x*blockDim.x + threadIdx.x;
float x = scale(i, N);
d_out[i] = distance(x, ref);
printf("i=%2d:dist from %f to %f is %f.\n", i, ref, x, d_out[i]);
}
int main() {
float ref = 0.5f;
float *d_out = 0;
cudaMalloc(&d_out, N * sizeof(float));
distanceKernel <<<N/TPB, TPB>>>(d_out,ref,N);
system("pause");
cudaFree(d_out);
return 0;
}
编译成功
结果
Reference
[1] Storti D , Yurtoglu M . CUDA for Engineers: An Introduction to High-Performance Parallel Computing[C]// Addison-Wesley Professional. Addison-Wesley Professional, 2016.
[2] 欧阳求败 https://www.bilibili.com/read/cv7335974/