我是CUDA的新手,我想知道我是否可以做这样的事情:
__global__ void MCkernel ( curandState* globalState, int* jumpGPU, int* nghPtrGPU, \
int* nghOffset)
{
// get idx
int idx = (threadIdx.x+blockDim.x*blockIdx.x);
// set up curand and generated state for each thread...
curandState localState = globalState[idx];
float randP = curand_uniform( &localState );//the random number (0,1)
globalState[idx] = localState;
// assume ranges vary by thread index
int ptr2ngh=jumpGPU[idx];
int min = (int)nghPtrGPU[ptr2ngh];
int max = (int)nghPtrGPU[ptr2ngh+1];
nghOffset[idx] = min + (int)truncf(randP *(max - min-1) \
+ min+0.5f );
}
我使用Jump [idx]值来访问nghPtrGPU,即nghPtrGPU [Jump [idx]] 如果是这样,我在这里做错了什么?上面的内核输出正确的randP,ptr2ngh但不是正确的nghOffset数组。任何帮助将不胜感激〜谢谢!
样本输出:
idx 0: randP:0.200745,ptr2ngh:25 --> nghOffset -2031558532.
idx 1: randP:0.288867,ptr2ngh:5 --> nghOffset -2029677060.
idx 2: randP:0.526483,ptr2ngh:32 --> nghOffset -2024603396.
idx 3: randP:0.922736,ptr2ngh:50 --> nghOffset -2016142724.
idx 4: randP:0.345037,ptr2ngh:25 --> nghOffset -2028477700.
idx 5: randP:0.943210,ptr2ngh:25 --> nghOffset -2015705476.
idx 6: randP:0.759569,ptr2ngh:14 --> nghOffset -2019626628.
idx 7: randP:0.995884,ptr2ngh:2 --> nghOffset -2014580868.
idx 8: randP:0.529909,ptr2ngh:9 --> nghOffset -2024530308.
idx 9: randP:0.238731,ptr2ngh:64 --> nghOffset -2030747524.
解决了:: nghOffset对设备的内存分配有一个新手错误,我调试了它并且效果很好。会做得更好,更好地解释我需要回答的问题。
答案 0 :(得分:0)
是的,使用一个数组成员作为另一个数组的索引是合法的,例如:
int min = nghPtrGPU[jumpGPU[idx]];
这在C / C ++中是合法的,它在CUDA C / C ++中也是合法的。显然,这没有说明索引越界等等。jumpGPU[idx]
返回的值必须是数组nghPtrGPU[]
的有效索引。这也与C / C ++没什么不同。
上述构造可能遇到的最常见问题可能是:
jumpGPU[idx]
不代表nghPtrGPU[]
jumpGPU
或nghPtrGPU
未在设备上正确分配使用cuda-memcheck
tool可以发现上述任何一种错误。任何时候你遇到cuda代码都有问题,做proper cuda error checking总是一个好主意。
在大多数情况下,CUDA C / C ++遵循C / C ++语言规则,有些restrictions。
事实上,CUDA(C / C ++)主要实现了一个具有GPU特定扩展的C ++编译器。但是,由于C和C ++之间存在很多共性,我们可以在很多情况下将其称为C / C ++风格的语言。