1.我們gpu本身有記憶體限制的問題,所以我想問在程式中我可以假設最大幾個雙精準度的浮點數給gpu使用,我知道一個雙精準度的浮點數是8 bytes,假如我們已經配置好給gpu每個陣列的記憶體了(剛好gpu最大記憶體容量),那計算中不需要用到記憶體嗎?還是說還有一些需要用到記憶體的例如 迴圈 , 邏輯判斷 要用到嗎?
ps:有兩個陣列分別是a(3,1),b(1,3),c(3,3)現在要跑個迴圈 i=1 , j=1 作 c=(i,j)a(i,1)+b(1,j) 的迴圈,那假如我用gpu跑記憶體使用量是多少?假如可以的話能幫我算算這個例子當作參考,謝謝
2.因為我的計算是針對一個大型的陣列運算,所以記憶體會吃非常多,因此會有記憶體不足的現象,例如 a(NX,NY,NZ),b(NX,NY,NZ),c(NX,NY,NZ)要作陣列迴圈的加減乘除NX,NY,NZ蠻大的 ,那這樣我想請問各位高手是怎麼把這樣的運算用cuda作分割的?,或者是說不管是CUDA C或CUDA FORTRAN,請問有特殊指令能直接將我們寫的迴圈讓系統幫我們作切割嗎?
system
2
楼主您好,
一、“可以使用多少个double", 等效于问:“可以使用多少显存”。 所以,您的问题只需要去讨论可以给一个kernel的一次运行,提供多少可用的显存/内存了。首先说, 您的“配置好每个数组所用的内存,正好为最大的global memory容量“是不可以的。正如您所说的,”还有其他要用到显存的地方“。 但具体却不是您所认为的,某些特定的例如循环或者逻辑判断指令等,等额外动态吃显存。
a)首先说,任何指令都回吃显存的,因为您的代码被放在global memory的一个特别的区域。但这从来不是我们需要担心的问题,因为代码的长度终归是有限的。如果我没记错的话,在fermi上,最多一个kernel可以支持1M条指令,如果算一条指令是8B大小。那么您的kernel的代码本身,最大可以占用大约8-10MB的global memory,无论里面包含的是循环、判断还是什么其他的指令。
b)在我们日常使用常见的吃显存的就是因为操作系统本身了,例如在windows 7 64-bit下,开机什么都不做,大约会吃掉100MB左右的global memory. 不过如果你的卡没有接显示器,也不需要考虑这点。
c)第三点最能容易看到的额外吃掉显存的地方,就是建立context, (这点在runtime api里是自动和隐式的),一个空的context的建立,基本上就要吃掉几十到100MB左右的global memory. (但是建立stream等却几乎不消耗global memory)
所以,您的第一个问题:您所能够使用的global memory大小,从我个人的经验看,基本上是global memory总数减去200MB左右。当然您也可以自己尝试找到具体数值。
二:您的:“对使用大数据量的算法的内存自动切割的问题”,我个人观点,目前没有自动的解决方案,只能靠您自己切换,分配,和算法的编写了。
考虑到您可能是台湾省的朋友,这里列出一些常见的词汇区别:
記憶體:显存,global memory
陣列: 数组,array
迴圈: 循环, loop
作业系统:操作系统,OS