[问题] CUDA关于Threads新手问题

楼主: qcmi (Alexam)   2014-12-31 22:21:05
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VS2013
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
CUDA
问题(Question):
先附上程式码:
http://ideone.com/RwJCBZ
给一个input array
并且总共有GridDim*BlockDim个Threads(例子里面是1*4)
假设
Input[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
^^^^^^^ ^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^
Thread1 Thread2 Thread3 Thread4
希望用Threads分别把各自的Input范围加总
Output[0]=1+2+3+4 = 6;
Output[1]=5+6+7+8 = 22;
Output[2]=9+10+11+12 = 38;
Output[3]=12+13+14+15 = 54;
但这个程式好像只有在GridDim=1的情况下才会正确
如果GridDim不为1,譬如(2*2)
虽然一样是有4个Threads,
但是就只有第一个Block的Threads答案会正确,
错误Output如下:
Output[0]=6;
Output[1]=22;
Output[2]=14;
Output[3]=30;
想请问是否我__global__ kernel的部分有理解错误吗?
谢谢
作者: PkmX (阿猫)   2013-01-01 01:18:00
原本结果应该就是错的吧 你的output array根本没有初始化然后你改用2D grid的时候有考虑到blockIdx.y吗?若是2D grid和1D block要把他map到一维index 你的idx应该是(blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x +threadIdx.x可是你cudaMalloc出来在device上的output array没有初始化啊
楼主: qcmi (Alexam)   2013-01-01 14:45:00
我是直接参考cuda vecAdd的范例,output array在cudaMalloc完之后好像就直接呼叫Kernel计算了, output没有cudaMemcpy到device, 请问这样是错的吗? d_output也要用cudaMemcpy?
作者: PkmX (阿猫)   2013-01-01 14:48:00
因为vector add是直接用=给值啊 你用+=原本就要先初始化以你的例子应该是循环开始前先清成0就好 或是用cudaMemset至于设计上的问题 你目前的写法就和你想的一样不是吗@@不懂为什么要把2D的grid扯进来把问题复杂化原来你所谓的2*2是指2*2=4 我以为你是想要用dim3(2,2)...话说应该ndx = idx * steps吧?你现在这样会加乘顺序是错的

Links booklink

Contact Us: admin [ a t ] ucptt.com