在VS上配置CUDA运行环境的问题与解决方法
1、VS新建项没有NVIDIA CUDA选项
在VS2019上添加新建项
在VS2015上添加新建项
这里可以参考如下链接:
https://forums.developer.nvidia.com/t/no-project-templates-in-vs2017/69306
主要的问题是在D:\VS2019\VS2019\Common7\IDE\Extensions\NVIDIA路径中(上述路径以实际安装路径为主)没有存在对应的向导文件
创建$上述路径\CUDA 10.0 Wizards\10.0文件夹,新建两个快捷方式
extension.vsixmanifest
和
Nvda.Vsip.CudaWizards.dll.pkgdef
打开 Visual Studio 2017 开发人员命令提示符并运行“devenv.com /setup /nosetupvstemplates”
最终可以解决上述问题
2、Windows上能否同时存在两个版本的CUDA?
答案是可以的,我的电脑上就同时安装了CUDA v8.0和CUDA v10.0,如下图
而且对于两个CUDA我都在系统里添加了环境变量,如下图
其中CUDA_PATH我设置的是CUDA v10.0的路径,所以在cmd中输入“nvcc -V”查看CUDA版本时显示的是10.0的信息
在具体的使用时,通过在项目属性中添加不同路径下的静态库.lib或属性文件即可以在不同的CUDA版本中切换运行,我在两个项目中分别使用CUDA8.0和CUDA10.0,都可以正常运行
3、无法打开helper_math.h文件或其他文件
首先要明确的是help_math.h是CUDA的一个自带的头文件,可以使用一些数学函数进行加速计算,CUDA在安装时会将该类型的文件会统一下载这些文件
需要将这个头文件所在的路径添加到我们的项目中
4、调用部分CUDA函数时出现“无法解析外部符号”的报错
1)error LNK2019: 无法解析的外部符号 _cudaGetDeviceCount@4,该符号在函数 “bool __cdecl InitCUDA(void)” (?InitCUDA@@YA_NXZ) 中被引用
2)error LNK2019: 无法解析的外部符号 _cudaGetDeviceProperties@8,该符号在函数 “bool __cdecl InitCUDA(void)” (?InitCUDA@@YA_NXZ) 中被引用
…etc.
出现这种问题是因为未添加cudart.lib依赖项
在项目->project 属性->链接器->输入->附加依赖项中添加对应cudart.lib文件
如果在CUDA安装时使用的时默认安装路径,则cudart.lib文件的路径应该如下:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64\cudart.lib
或
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\Win32\cudart.lib
这里需要注意的是存在32位和64位的文件,分别对应VS以x86和x64两种方式运行,注意将两者进行对应,否则还是会报错
这里我为了保险起见将两个文件都添加了
5、测试运行
最后输入代码测试运行即可,这里我从网上随便摘抄了一段代码进行测试
可以创建一个.cu文件输入以下内容:
#include <iostream>
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
bool InitCUDA()
{
int count;
cudaGetDeviceCount(&count);
if (count == 0)
{
fprintf(stderr, "There is no device.\n");
return false;
}
int i;
for (i = 0; i < count; i++)
{
cudaDeviceProp prop;
if (cudaGetDeviceProperties(&prop, i) == cudaSuccess)
{
if (prop.major >= 1)
{
break;
}
}
}
if (i == count)
{
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}
cudaSetDevice(i);
return true;
}
然后创建一个cpp文件输入以下内容:
#pragma once
#include <iostream>
#include "utils.h"
#include "cudaTest.cu"
using namespace std;
int main(int argc, char** argv)
{
if (!InitCUDA())
{
return 0;
}
printf("HelloWorld, CUDA has been initialized.\n");
system("pause");
return 0;
}
最终测试结果如下: