最近在做一个科学计算的程序,其中有一堆固定的数组,和一小部分动态变化的数组。
目标是用少部分动态变化的数据,结合静态不变的数据,使用GPU多线程并行计算新的value,保存结果;就这样周而复始,再次进行GPU计算。
问题是:能否将这堆堆固定的数组静态的存入GPU中,每次开始GPU多线程计算的时候都能正确的提取?
当然可以每次循环都把这堆固定数据写入GPU,也可以直接从GPU读主存,但静态的放到显存是最合理的方案。
请问怎样能实现?
最近在做一个科学计算的程序,其中有一堆固定的数组,和一小部分动态变化的数组。
目标是用少部分动态变化的数据,结合静态不变的数据,使用GPU多线程并行计算新的value,保存结果;就这样周而复始,再次进行GPU计算。
问题是:能否将这堆堆固定的数组静态的存入GPU中,每次开始GPU多线程计算的时候都能正确的提取?
当然可以每次循环都把这堆固定数据写入GPU,也可以直接从GPU读主存,但静态的放到显存是最合理的方案。
请问怎样能实现?
楼主好!
您的题目中包含的问题,一般你可以认为是的。考虑到您是初学者,我简单的说下:
device 中的数组,或者cudaMalloc出来的global memory, 在本context有效期间(例如cudaDeviceReset前)内一直有效。所以可以比此context内的一次kernel启动的一个线程的存活时间长。
您帖子里的第2个问题:“能否将这堆堆固定的数组静态的存入GPU的global memory,每次开始GPU多线程计算的时候都能正确的提取?” – 答案则是显然可以的。简单的解释下为何我这么说:因为您的显存具有保存数据,和再次读出的能力。(在context有效期间).
而你的最后的第3个问题,“如何实现”,则可以这样:
从global memory分配一段显存(或者2段,如果有利于实现或者提高代码可读性的话)
初始化此段显存的值(如果需要)
…
第一次启动你的kernel, 从此段显存读取,然后写入此段显存。(或者写入第二段).
第二次启动你的kenrel, 从此段(或者2段)显存读取,然后写入此段(或者第1段)显存。
第三次启动你的kernel, 从此段(或者1段)显存读取,然后写入此段(或者第2段)显存.
…
完成!
如此是可以的。楼主要不要尝试下?
很详细,手机回复个简短版的。那就是host端用API cudaMalloc分配的空间直到cudafree或者运行结束才释放。在这中间想怎么用就怎么用,无论kernel启动多少次。
详细而严谨的说法请参考横扫千军版主的回答。
参考2楼版主答案即可,另外建议楼主多看相关资料后再做开发。