当前位置:   article > 正文

Windows+Visual stdio+CUDA编程方式及测试_vsstudio cuda调试

vsstudio cuda调试

一、visual stdio内针对工程的配置

1、新建一个空项目

在这里插入图片描述
在这里插入图片描述
建立好的工程右侧解决方案栏应该包含一下几个文件
在这里插入图片描述

2、配置CUDA生成依赖项

选中工程(建立的工程名,如图中的project3),右键–生成依赖项-生成自定义
在这里插入图片描述
在打开的窗口找到CUDA项选中:
在这里插入图片描述
PS-----这里遇到找不到CUDA的问题,解决方案:
如果没有列表中没有,点击 “查找现有的”。 在cuda的安装目录下,默认安装的,一般在: C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v10.0\extras\visual_studio_integration\MSBuildExtensions
添加里面的文件进来就行, 然后选择,确定。

3、配置基本库目录

右键工程→ 属性→ VC++目录 → 包含目录,添加以下目录(根据自己安装位置确定找到对应文件):

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\inc
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
  • 1
  • 2

ProgramData在C盘中有时是隐藏状态,在编辑栏的查看项中打开隐藏文件选项即可看到
在这里插入图片描述
在库目录中添加以下目录:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\lib\x64
  • 1
  • 2

在这里插入图片描述

4、配置静态链接库路径

右键项目 → 属性 → 配置属性 → 链接器 → 常规 → 附加库目录,添加以下目录:
点击添加图标,输入$(CUDA_PATH)\bin,确定。(这个指令会自动计算bin文件夹所在位置并添加到目录中,当然也可以直接找到文件目录整体添加进去)
在这里插入图片描述
链接器 → 输入 → 附加依赖项
这里面已有一些库名:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
  • 1

这些库为原有!
在这里插入图片描述
这里可以看到系统已经将一些Lib库文件名加进去了,但是做一些项目的时候发现会报错:找不到***库的情况,此时,就需要手动添加一些,如果仅仅是lib文件在,名字没添加,可以在这里添加,但如果是文件没有就需要下载再添加。下面给出一些大部分系统都有的lib库名:

cublas.lib;cublas_device.lib;cuda.lib;cudadevrt.lib;cudart.lib;cudart_static.lib;cufft.lib;cufftw.lib;curand.lib;cusolver.lib;cusparse.lib;nppc.lib;nppial.lib;nppicc.lib;nppicom.lib;nppidei.lib;nppif.lib;nppig.lib;nppim.lib;nppist.lib;nppisu.lib;nppitc.lib;npps.lib;nvblas.lib;nvcuvid.lib;nvgraph.lib;nvml.lib;nvrtc.lib;OpenCL.lib;
  • 1

以上也是 “第3步” 中添加的库目录 “C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64” 中的库!

5、配置源码文件风格

配置这个后,建立CUDA工程或者添加CUDA项中写入的代码就会变得有颜色。
右键源文件 → 添加 → 新建项 → CUDA C/C++ File,输入.cu文件名建立一个cu源文件
在这里插入图片描述
右键 “xxx.cu" 源文件 → 属性 → 配置属性 → 常规 → 项类型 → 设置为“CUDA C/C++”
在这里插入图片描述

6、扩展文件名配置

针对安装好后没有CUDA模块问题)
(1)工具->选项->文本编辑器->文件拓展名, 新增扩展名 .cu 、.cuh 编辑器 Microsoft Visual C++ 添加
(2)工具->选项->项目和解决方案->vc++项目设置->要包括的拓展名
将 .cu和.cuh 加上,用分号 ; 隔开
在这里插入图片描述
在这里插入图片描述
以上步骤参考网页

二、样例测试

有两种方式进行CUDA编程
(1)创建工程→ 空项目→ 右键源文件 → 添加 → 新建项 → CUDA C/C++ File
可以得到.cu文件进行CUDA开发
(2)创建工程→ 搜索到CUDA runtime→ 创建
这样新建后会看到一个kernel.cu文件,是系统自带的测试样例,把他的内容删除就可以开始自己的开发了
本文选用第二种方式:

测试样例1

这是sample中的一个代码VectorAdd

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
 
#include <stdio.h>
 
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
 
__global__ void addKernel(int *c, const int *a, const int *b)
{
	int i = threadIdx.x;
	c[i] = a[i] + b[i];
}
 
int main()
{
	const int arraySize = 5;
	const int a[arraySize] = { 1, 2, 3, 4, 5 };
	const int b[arraySize] = { 10, 20, 30, 40, 50 };
	int c[arraySize] = { 0 };
 
	// Add vectors in parallel.
	cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "addWithCuda failed!");
		return 1;
	}
 
	printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
		c[0], c[1], c[2], c[3], c[4]);
 
	// cudaDeviceReset must be called before exiting in order for profiling and
	// tracing tools such as Nsight and Visual Profiler to show complete traces.
	cudaStatus = cudaDeviceReset();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaDeviceReset failed!");
		return 1;
	}
 
	return 0;
}
 
// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
	int *dev_a = 0;
	int *dev_b = 0;
	int *dev_c = 0;
	cudaError_t cudaStatus;
 
	// Choose which GPU to run on, change this on a multi-GPU system.
	cudaStatus = cudaSetDevice(0);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
		goto Error;
	}
 
	// Allocate GPU buffers for three vectors (two input, one output)    .
	cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMalloc failed!");
		goto Error;
	}
 
	cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMalloc failed!");
		goto Error;
	}
 
	cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMalloc failed!");
		goto Error;
	}
 
	// Copy input vectors from host memory to GPU buffers.
	cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!");
		goto Error;
	}
 
	cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!");
		goto Error;
	}
 
	// Launch a kernel on the GPU with one thread for each element.
	addKernel << <1, size >> > (dev_c, dev_a, dev_b);
 
	// Check for any errors launching the kernel
	cudaStatus = cudaGetLastError();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
		goto Error;
	}
 
	// cudaDeviceSynchronize waits for the kernel to finish, and returns
	// any errors encountered during the launch.
	cudaStatus = cudaDeviceSynchronize();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
		goto Error;
	}
 
	// Copy output vector from GPU buffer to host memory.
	cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!");
		goto Error;
	}
 
Error:
	cudaFree(dev_c);
	cudaFree(dev_a);
	cudaFree(dev_b);
 
	return cudaStatus;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

复制到删除内容的kernel文件中,点击执行,显示以下界面即为成功:
在这里插入图片描述

样例1问题:找不到helper_cuda.h文件

但是事情总没有那么简单,遇到了很常见的一个问题:找不到helper_cuda.h文件,解决方案:
右键cuda项目——属性——配置属性——C/C++——常规——附加包含目录(版本不同,这个结构可能为英文,如我的2019版本界面)
在附加包含目录里添加helper_cuda.h的地址,这里默认安装的地址为
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\inc
在这里插入图片描述
类似的<helper_string.h>,<helper_cuda.h>和<helper_functions.h>等找不到均可使用此解决办法。
还遇到了一个狗血的bug,就是加入了目录还是无法找到文件,找了很多方式,最后发现重启一下软件就好了。所以上面的一系列配置,如果配置好还发现有bug,记得先关掉重新打开试试。

测试样例2

这是一个打印电脑配置的程序

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

int main() {
    int deviceCount;
    cudaGetDeviceCount(&deviceCount);

    int dev;
    for (dev = 0; dev < deviceCount; dev++)
    {
        int driver_version(0), runtime_version(0);
        cudaDeviceProp deviceProp;
        cudaGetDeviceProperties(&deviceProp, dev);
        if (dev == 0)
            if (deviceProp.minor = 9999 && deviceProp.major == 9999)
                printf("\n");
        printf("\nDevice%d:\"%s\"\n", dev, deviceProp.name);
        cudaDriverGetVersion(&driver_version);
        printf("CUDA驱动版本:                                   %d.%d\n", driver_version / 1000, (driver_version % 1000) / 10);
        cudaRuntimeGetVersion(&runtime_version);
        printf("CUDA运行时版本:                                 %d.%d\n", runtime_version / 1000, (runtime_version % 1000) / 10);
        printf("设备计算能力:                                   %d.%d\n", deviceProp.major, deviceProp.minor);
        printf("Total amount of Global Memory:                  %u bytes\n", deviceProp.totalGlobalMem);
        printf("Number of SMs:                                  %d\n", deviceProp.multiProcessorCount);
        printf("Total amount of Constant Memory:                %u bytes\n", deviceProp.totalConstMem);
        printf("Total amount of Shared Memory per block:        %u bytes\n", deviceProp.sharedMemPerBlock);
        printf("Total number of registers available per block:  %d\n", deviceProp.regsPerBlock);
        printf("Warp size:                                      %d\n", deviceProp.warpSize);
        printf("Maximum number of threads per SM:               %d\n", deviceProp.maxThreadsPerMultiProcessor);
        printf("Maximum number of threads per block:            %d\n", deviceProp.maxThreadsPerBlock);
        printf("Maximum size of each dimension of a block:      %d x %d x %d\n", deviceProp.maxThreadsDim[0],
            deviceProp.maxThreadsDim[1],
            deviceProp.maxThreadsDim[2]);
        printf("Maximum size of each dimension of a grid:       %d x %d x %d\n", deviceProp.maxGridSize[0], deviceProp.maxGridSize[1], deviceProp.maxGridSize[2]);
        printf("Maximum memory pitch:                           %u bytes\n", deviceProp.memPitch);
        printf("Texture alignmemt:                              %u bytes\n", deviceProp.texturePitchAlignment);
        printf("Clock rate:                                     %.2f GHz\n", deviceProp.clockRate * 1e-6f);
        printf("Memory Clock rate:                              %.0f MHz\n", deviceProp.memoryClockRate * 1e-3f);
        printf("Memory Bus Width:                               %d-bit\n", deviceProp.memoryBusWidth);
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

执行可以得到:
在这里插入图片描述
初次执行也遇到了一些问题,后来发现是之前的库没有配置好,有bug的话可以重新建立工程配置试试。

测试样例3

待更新

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/305952
推荐阅读
相关标签
  

闽ICP备14008679号