在vs2010上运行CUDA6.0需要什么

在vs2010上运行CUDA6.0需要什么,第1张

要在VS2010上运行CUDA60,你需要以下几个步骤:

下载并安装CUDA Toolkit 60

首先,你需要从NVIDIA官网下载CUDA Toolkit 60,并按照提示进行安装。在安装过程中,请注意选择正确的 *** 作系统和Visual Studio版本。

2 配置Visual Studio

在安装完成后,你需要启动Visual Studio,并打开项目属性配置页面。在这里,你需要添加CUDA相关的编译器、链接器和头文件路径。

具体来说,在C/C++选项卡中,你需要将下列路径添加到"附加包含目录"中:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v60\include

在链接器选项卡中,你需要添加以下路径到"附加库目录":

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v60\lib\x64 (如果你的 *** 作系统是64位的)

最后,在"预处理器定义"中,添加 "_WIN64" 和 "WIN32" 这两个宏定义。

3 编写CUDA程序并运行

现在,你已经完成了配置工作,可以开始编写CUDA程序了。在程序中,你需要使用CUDA提供的语言扩展(如 __global__ 和 __device__)来标识出GPU可执行的函数,并使用CUDA专用的数据类型(如cudaMalloc()和cudaMemcpy())来管理GPU内存。

编写完CUDA程序后,你可以直接在Visual Studio中编译和运行程序。在调试过程中,你可以使用Visual Studio提供的调试工具来追踪CUDA程序的运行状态。

总结:

要在VS2010上运行CUDA60,你需要安装CUDA Toolkit 60,并在Visual Studio中进行配置。之后,你可以编写和调试CUDA程序,并使用Visual Studio提供的工具来优化程序性能和调试错误。

&i是求i的地址,i本身就是一个指针了,所以取地址后是二级指针

这里为了把申请地址的空间赋值给i,以便让i能够访问。如果直接用i不用&i只是把i的拷贝传进去

比如求两个矩阵相加:

并行(CUDA)

__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) {

    int i = threadIdxx;

    int j = threadIdxy;

    C[i][j] = A[i][j] + B[i][j];

}

 

int main() {

    // Kernel invocation with one block of N  N  1 threads

    int numBlocks = 1;

    dim3 threadsPerBlock(N, N);

    MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);

}

非并行

#define N 512

void MatAdd(float A[N][N], float B[N][N], float C[N][N])

{

for ( int i = 0; i < N; ++i )

{

for ( int j = 0; j < N; ++j)

{

C[i][j] = A[i][j] + B[i][j];

}

}

}

1在SDK自带的例子程序中,发现SRC文件珜下有cpp文件和cu文件。这两种文件的关系和各自的作用是什么呀?

答:SDK自带例子中的cpp文件主要是一些CPU端处理,或者是使用CPU计算对照组结果,在某些例子中也会在cpp文件中以函数的形式调用封装成C或者C++函数的GPU端代码cu文件中通常是与GPU核函数和CUDA API相关的内容。

2在SDK自带的例子程序中,有一些带有_kernel的cu文件,在Visual Studio工程中的图标上有一个红色的符号,是什么意思?

答:大多数SDK例子程序都将设备端代码和主机端代码放在不同的文件中,以template为例如:它的主机端代码在templatecu中,设备端代码在template_kernelcu中,并且有一个用于对照的CPU 和GPU结果的cpmpute_goldcpp文件。template_kernelcu 在visual Studio工程中的符号代表它不参与编译。注意到templatecu文件中已经通过#include"template_kernelcu"包含了template_kernelcu。如果要将SDK中的代码直接用于其他工程中,一定要注意将带有_kernel后缀的cu文件排除在编译外,避免重复定义。

3为什么编译CUDA程序时,经常出现未定义变量的错误?

答:存储在某些存储器中的某些变量,如__constant__,__device__,texture, 必须在所有的函数定义外定义,即定义的全局变量。这些变量必须有正确的作用域,例如texture型变量必须对设备端代码和主机端代码同时可见,并且如果需要从主机端访问时,也要对主机端代码可见。SDK中的例子通过文件包含解决了这些问题。读者可以将主机端代码和设备端代码都写在一个cu文件中,或都是将这些变量定义在头文件中(注意避免重复定义)来解决这些问题。

4为什么在工程中无法使用原子函数,双精度等功能?

答:首先,必须确定目前使用的设备的计算能力版本能支持相应的函数;其次,在编译时,nvcc编译器默认的目标设备为计算能力10版本,无法支持高计算能力版本的函数,需要通过-code,-arch等编译选项打开。

5CUDA程序运行时出现蓝屏、死机等现象,或者打印出kernel luanch timed out?

答:早期版本的CUDA更加容易出现蓝屏或者死机,目前已经大有改善。造成蓝屏、死机、自动重启等现象的常见原因主要有:访问显存时发生趆界、多个线程竞写同一数据。kernel launch timed out的原因是Windows *** 作系统会查询显卡状态,如果显卡长时间没有反应就会重启显卡,这限制了一个kernel的执行时间。经过试验,在XP系统下kernel不能超过12秒,而Vista和Win7 *** 作系统的时间还要更短一些。如果发生这一问题,应该首先检查代码中是否出现了死循环或者竞写,然后采用减小kernel、采用stream *** 作等手段避免。如果确实需要在一个kernel中完成较大的计算量,可以使用更强的显卡、使用专门的Tesla流计算方案、改用Linux *** 作系统,或者使用一块不进行显示的显卡(但是Vista和Win7有时会关闭没有插显示器的显卡)。未来版本的CUDA会对这些问题继续进行改进。

6为什么在编译或者运行时会出现资源不足的提示?

如果在程序中使用了太多的register,shared,texture或者constant资源,在编译时会出现报错;如果运行中使用了太多的显存,或者是一个block中的线程太多,在运行时会出现错误。在低运算能力版本的硬件上运行为高计算能力设备编写的程序时也会发生错误。在使用变量时,需要注意各种变量的大小不能超过目标设备的计算能力版本本的相应限制,使用的显存也不能超过显存的量(如果这个显卡还需要输出显示,还要减去显示使用的显存大小)。解决资源方法主要有:减少程序使用的资源,注意释放不用的显存和内存,可者将问题进行分治。如果确有需要,应该使用拥有更大存储器的显卡,或者Tesla,Quadro等专业解决方案。

7为什么时候在程序中无法得到正确的结果?为什么有时每次运行的结果都不同?为什么GPU的结果与CPU的结果不同?

答:由于CUDA中存在大量线程的并行,因此程序中细小的错误也会产生相当严重的后果。造成结果错误的可能原因有:死循环、类型溢出、错误的数据类型、访存赿界、竞写、缺乏同步、编译器因素等。如果是发生多线程竞写一个数据的情况,应该采用原子 *** 作来避免;在shared memory 发生warp间交换 *** 作的数据时,一定要使用栅栏同步保证数据的可靠性;编译器会优化掉它认为多余的的存储访问,要通过valid关键字进行管理;过于复杂的循环有时无法被正确解析,产生错误结果。如果同一个程序对同一组数据每次运行得到的结果不同,一般是发生了竞写,或者缺乏同步。GPU和CPU的运算单元采用了不同的微架构,因此即使都符合IEEE 754规范,结果不一样是理所当然的。由于CPU 中可以使用更长字长的存储器来保存中间变量,因此通常使用CPU计算得到的结果要略高一些。

   起源于前段时间做的一个GPU实验,关于两个CUDA进程的进程间通信(用CUDA-IPC机制,一个进程在显存中写,另一个进程一边自旋锁一边读数据是否被更改)。实验过程中发现(环境为Ubuntu16/18),在 Pascal 架构的电脑上做的时候,实验是 成功 的。然而转到 Maxwell 架构的电脑上做,发现CUDA程序自旋锁会导致 桌面卡住 ,即使放弃桌面转到tty控制台中做 依然失败 ,因为B进程自旋锁的时候会导致 A进程卡主 ,根本写不进去。

  一开始认为 原因 是在Pascal架构之前,没有MPS技术,多个cuda进程无法同时在GPU中执行。但事实上软件支持的MPS对硬件计算能力要求不高(>=35),cuda>=55就可以。且MPS一般默认关闭,在Pascal架构上实验时也并没有开启MPS。

  后来发现原因是Pascal架构开始支持计算抢占。

相关技术及对应的架构:

CUDA Context

MPS

推荐阅读 MPS官方文档 以及 MPS相关博客 。

个人理解:相当于用一个context整合了多个context。

待深入了解:MPS的硬件隔离

自问自答:

Q:多个主机进程默认创建的Context是同一个吗?

A:是不同的Context。

Q:Pascal架构之前,桌面渲染和通用计算也是可以同时进行的呀?

A:事实上并没有真正同时进行,只是交替进行,宏观看上去会有并发的效果。如果cuda程序占用GPU时间过长,会被桌面图形程序停掉。

Q:图像渲染都需要用GPU吗?

A:不一定,某些软件计算量大且专门针对GPU做了优化的话才会用到GPU。

Q:GPU 通用计算会影响渲染任务吗

A:如果两个计算量都比较大的话肯定会相互影响

使用CUDA Toolkit *** 作计算。

1、安装CUDA扩展:在VisualStudioCode中安装CUDA扩展程序。可以在VisualStudioCode的扩展商店中搜索“CUDA”并安装。

2、编写CUDA程序:编写CUDA程序并保存。CUDA程序可以使用CUDAC/C++或者CUDAFortran语言编写。

3、编译CUDA程序:按下F1键打开命令面板,输入“CUDA: Build”命令来编译CUDA程序。如果编译成功,则会生成可执行文件。

以上就是关于在vs2010上运行CUDA6.0需要什么全部的内容,包括:在vs2010上运行CUDA6.0需要什么、cuda程序中cudaMalloc()经常使用,比如:int *i; cudaMalloc((void**)&i,sizeof(int));、求一段用并行语言写的程序,CUDA,openCL写的都行,然后再用串行语言写出来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10088833.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存