我是新手,如果提的问题比较无聊,希望大侠们不要嫌弃。
我先把主机的A矩阵传给设备的B矩阵,然后对B进行处理,结果存回B矩阵,再把B矩阵传回主机A矩阵,得到的A矩阵结果全是零。请问:是CUDA不支持还是我编程有误?
代码比较长,不好贴出来。如果CUDA支持,能否为我写一段简单的测试程序?感激不尽!
我的数据量比较大,运行的时候会死机,应该是显存不够。如果数据处理了又放回原处,那我就不用开辟那么多显存。可是我一存回原处,得到的结果就全是零。
另外,在主机里可以用define N 100,然后定义矩阵a[N].在GPU里面有没有类似的功能?
刚注册没几个币,希望高手不吝赐教!
LZ您好:
1:读取某个矩阵的值并回写到原来的存储空间,这个果断是支持的。但是您需要确保您的算法实现的正确性,比如说算法一:读取矩阵A每个元素,+5,回写。这个算法直接展开写成CUDA实现毫无问题。但是比如说算法二:读取矩阵A的同一列的相邻两个元素,相加,回写的行序号较小的对应位置(以及边界有一些特别约定),这个直接展开的话,因为是多线程操作,有些线程读到的是被累加前的数据,有些线程读到的是累加后的数据,这样结果是错误的。此时可以直接另开一个数组,用于保存结果即可。
所以单纯说能否回写到相同的位置,这个是可以的。
这样做是否正确,需要您根据您的算法考虑。
2:您的传回结果都是0,这个有可能是您GPU端的程序运行失败了,也可能还有其他原因。但是您没有提供进一步的信息,所以无法继续分析了。不过这个应该是您程序的BUG。
3:“数据量较大”和“运行时会死机”和“应该是显存不够”这三者无直接因果关系的。您需要拿到确切的调试信息来分析,而不是这样主观猜测。
4:#define是预编译宏,并不局限于host端使用的。
大致如此,祝您编码调试顺利~
您的回答对我帮助很大,谢谢您。我已经实现了将处理后的数据存回原地。现在又有一个问题:
我的程序要处理一个160000行,128列的矩阵。如果我只处理10000行,结果就是正确的。如果我把160000行都处理了,要么直接蓝屏死机了,要么得到的结果全是0,请问我这种情况可能是由什么原因引起的呢。
我的GPU是GT610,矩阵为FLOAT型,经过计算,显存也够大了。
盼望您的回复,谢谢。
您的kernel可能执行超时(超过2秒)了,您需要取消时间限制:
(1)请您安装nsight,
(2)启动nsight monitor
(3)右下角nsight图标右键——options——general——Microsoft Display Driver
(4)将WDDM TDR Delay改长(单位为秒),或者直接将WDDM TDR enabled改为False。
感谢来访。
你好,我下载了“资源与下载”里的NVIDIA_Nsight_Visual_Studio_Edition_Win32_3.0.0.12350,但是安装时提示我的系统不对,我是winXP,32位,VS2008,请您指导如何安装。
请您立刻升级到Windows 7,
windows XP即将停止支持(例如cuda 5.5中的部分组件已经不支持xp了)。
我的系统已经换成64位WIN7,现在论坛里找不到SDK,能麻烦您给个下载链接吗?
另外,论坛里有NVIDIA_Nsight_Visual_Studio_Edition和NVIDIA_PARALLEL_NSIGHT,这两个东西一样吗?我应该装哪个?
楼主您好,我没有建议过您下“SDK"的,如果是别人给您的建议,您应该直接找当初给您建议的人。
以及,现在的"SDK Examples"已经集成在cuda toolkit里了。
请使用nsight visual studio edition, 而parallel nsight是它的老版本的名字,现在已经改名,去掉了parallel字样。
以及补充一下横扫斑竹:
建立LZ去NVIDIA官网下载CUDA Toolkit和nsight。
如果在本坛寻找资源,可以直接联系资源版的斑竹must,他能为您提供充分的建议。
祝您好运~
system
10
NSIGHT已安装,按您说的把,运行程序果然不死机了,并且可以得出结果。但是安装的时候出现一个提示,
这是什么意思呢,需不需要理会?
system
11
楼主您好,如果您只需要启动nsight monitor(例如给远程的另外一台机器提供调试服务),那么您无需理会。
如果您需要调试您的kernel,建议您需要理会,理会方式如下:
(1)安装VS 2010
或者
(2)对您的VS 2008打上SP1补丁。
然后请重新执行安装过程。
感谢周末来访。
system
12
我要处理一个160000*128的矩阵,每一行都进行相同的运算,即同一套算法重复160000次,这样就把整个矩阵处理完毕。我的GPU只有48个核,我先把要处理的矩阵放到global memory,我的思路是每个核处理一行,即任何时刻都有48行并行执行,但是结果发现,这样做并没有提高速度。同一个算法,GPU完成运算的时间是50秒,而用CPU的时间是53秒.MATLAB是35秒。
程序中对每一行的操作包括直流滤波、FFT、求相角、线性拟合等运算,这些运算全部都写在一个核函数中。不知道GPU里的CORE执行这些操作时是否能向CPU一样高效?我让每个CORE处理一行数据是否合理?
system
13
LZ您好:
1:您这样理解GPU的运行机制和规划您的算法实现可能无法使得访存过程得以优化,以达到较好的效果。请您研究一下手册中的合并访问方面的内容。
2:您的GPU本身并不是十分强大,此时面对较好多核CPU可能未必会更快。因为GPU虽然有48 CUDA CORES,但是考虑到主流4核CPU 有2~3倍的运行频率,以及SIMD等的优化,以及GPU实现还有数据传输的开销。
3:您的多项计算还需要您根据实际情况考虑。我无法直接回答您是应该拆开实现还是合起来实现。
同时,对于FFT,建议直接使用高效的cuFFT库。
以及请您考虑在一个CUDA CORE计算一行连续的数据的时候,访存效率如何。
总之,您需要适当了解下GPU的运行机制,再做安排。
祝您好运~
system
14
CUFFT是主机端函数,如果我用CUFFT的话,要将GPU的数据传回主机,FFT之后,又要将数据传回GPU继续处理,这样就增加了两次传输时间。所以我就直接在GPU里执行倒序、蝶形运算做FFT。不知道我这个理解对不对?
system
15
LZ您好:
主机端调用的函数并不代表其输入输出数据都在主机端。
关于cufft的相关事宜,请以官方手册为准。
[attach]3345[/attach]
CUDA 5.5自带的CUFFT的手册内容摘抄于此,供您参考。
此外,您自行实现GPU版的fft程序以期获得其他方面的好处(比如更好地配合您的其他程序部分等)也是完全可以的。
祝您好运~