VisualStudio2019配置CUDA v10.0 解决CUDA模板无法生成的问题 实现奇偶排序算法 您所在的位置:网站首页 vs解决方案不兼容 VisualStudio2019配置CUDA v10.0 解决CUDA模板无法生成的问题 实现奇偶排序算法

VisualStudio2019配置CUDA v10.0 解决CUDA模板无法生成的问题 实现奇偶排序算法

2023-08-08 17:33| 来源: 网络整理| 查看: 265

目录 前言一、 VS2019配置CUDA v10.0二、解决模板无法生成的问题(1)思路(2)安装VS2017编译器(3)原因分析(4)问题解决 三、奇偶排序算法实现及结果分析(1)串行部分(2)并行部分

前言

初次尝试CUDA编程,在Windows上配置CUDA环境属实麻烦。而且Visual Studio 2019在我做实验时还不支持CUDA,只能自己一步步踩坑配置一个模板…

一、 VS2019配置CUDA v10.0 前置条件:已经安装了Visual Studio。建议安装2017及以下版本,会省很多事情。下载CUDA,可以选择旧版本,但是一定要注意CUDA版本和自己的显卡是否适配,是否支持cuDNN加速。如果选择旧版本安装,就选择Legacy Releases,版本号为v10.0,进行下载即可。地址为

https://developer.nvidia.com/cuda-downloads

在这里插入图片描述

下载完成后,运行文件。注意,此时出现的地址为临时文件的存放地址,并不是最终安装的地址,可以随意选择。 在这里插入图片描述

建议初学者选择精简安装即可,即使选择自定义安装也需要安装所有的组件。截至我当初做实验时,也就是2020年上半年,CUDA10.0乃至最新的10.2都只支持Visual Studio 2017及以下版本,而我安装的是Visual Studio 2019,其中并没有CUDA组件,需要进行一系列操作,相当繁琐,强烈建议安装Visual Studio 2017。如果已经安装了2019的话,之后会提供一个解决办法。

如果正确安装完成后,再打开Visual Studio,新建项目中即可看到对应的CUDA模板工程文件。

二、解决模板无法生成的问题 (1)思路

可以得知,目前VS2019并不支持CUDA,2017是支持的。同时VS版本往往是向下兼容的,因此,通过安装2017的编译器,采取一些小措施修改一下,即可解决模板无法生成的问题。

(2)安装VS2017编译器

首先,请打开Visual Studio Installer,安装MSVC v141 – VS 2017 C++ x64/x86生成工具。这个工具对应了2017版本的编译器。 在这里插入图片描述

(3)原因分析

在默认安装CUDA的情况下,可以在此处找到sample文件:

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0

选择其中一个,比如:

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\1_Utilities\deviceQuery

进入后加载deviceQuery_vs2017.sln,会提示:intelliSense不可用。为了追踪项目加载失败的原因,我们需要设置环境变量追踪一下。

在这里插入图片描述

打开Developer Command Prompt for VS 2019,输入set TraceDesignTime=true,再输入devenv使环境变量生效。

在这里插入图片描述

之后在跳出来的Visual Studio窗口打开之前的sln文件,下方就会显示日志地址了。

在这里插入图片描述

找到该日志,在C:\Users\你的用户名\AppData\Local\Temp\,在最下方有以下提示。

在这里插入图片描述

现在,就可以解决问题了。

(4)问题解决

打开NVIDIA GPU Computing Toolkit目录下的

CUDA\v10.0\extras\visual_studio_integration\ MSBuildExtension

可以看到其中有4个文件,有一个就是CUDA v10.0.props,就是我们想要的配置文件。将其复制到图片中所说的目录下:

D:\Software\Microsoft Visual Studio 2019\MSBuild\Microsoft\VC\v160\BuildCustomizations

注意,每个人安装Visual Studio的位置不同。之后,再打开deviceQuery_vs2017.sln文件,右上角在“解决方案资源管理器”的项目上右键选择重新生成,就不会有任何报错了。这时,编译一下,可以看到结果。

在这里插入图片描述

当出现Result=PASS时,代表没有问题了。之后,需要更改一下设置属性,如下图所示,这样是为了保证可以搜寻到生成的文件。然后,更改一下.cpp文件的名称作为初始名称,并且添加一个文件,将其命名为kernel.cu作为核文件,以后内核函数将会在这里编写。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

另外,在编译过程中会出现某些函数比如__syncthreads(),或者内核函数调用中的>等,可能会无法识别。无需在意,这是Visual Studio无法识别,CUDA专用编译器nvcc可以正常编译。

最后的最后,选择项目-导出模板,设置一下,比如这样。

在这里插入图片描述

之后你就会发现,在新建项目中,已经可以找到CUDA模板了。

在这里插入图片描述

三、奇偶排序算法实现及结果分析 (1)串行部分

首先,先写串行的算法作为基准。代码如下:

//串行serial.c #include #include #include #include #define GET_TIME(now) { \ struct timeval t; \ gettimeofday(&t, NULL); \ now = t.tv_sec + t.tv_usec/1000000.0; \ } #define MAXN 130000 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void Odd_even_sort(int num[], int size) { int sorted = 0; while(!sorted) { sorted = 1; for(int i = 1; i swap(&num[i], &num[i + 1]); sorted = 0; } } for(int i = 0; i swap(&num[i], &num[i+1]); sorted = 0; } } } } int main(void) { double start, stop; int size = MAXN; int num[size]; for(int i = 0; i int idx = threadIdx.x; int temp; if (idx num[idx + 1]) { temp = num[idx]; num[idx] = num[idx + 1]; num[idx + 1] = temp; } __syncthreads(); } extern "C" void swapKernel(int* num, int size) { int* dev_num = 0; cudaSetDevice(0); cudaMalloc((void**)& dev_num, sizeof(int) * size); cudaMemcpy(dev_num, num, sizeof(int) * size, cudaMemcpyHostToDevice); for (int i = 0; i int num[MAXN]; for (int i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有