CUDA根据另一个数组的值访问第二个数组元素

时间:2014-03-03 21:19:47

标签: arrays cuda

我是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对设备的内存分配有一个新手错误,我调试了它并且效果很好。会做得更好,更好地解释我需要回答的问题。

1 个答案:

答案 0 :(得分:0)

是的,使用一个数组成员作为另一个数组的索引是合法的,例如:

int min = nghPtrGPU[jumpGPU[idx]];

这在C / C ++中是合法的,它在CUDA C / C ++中也是合法的。显然,这没有说明索引越界等等。jumpGPU[idx]返回的值必须是数组nghPtrGPU[]的有效索引。这也与C / C ++没什么不同。

上述构造可能遇到的最常见问题可能是:

  1. jumpGPU[idx]不代表nghPtrGPU[]
  2. 的有效数组索引
  3. 指针jumpGPUnghPtrGPU未在设备上正确分配
  4. 使用cuda-memcheck tool可以发现上述任何一种错误。任何时候你遇到cuda代码都有问题,做proper cuda error checking总是一个好主意。

    在大多数情况下,CUDA C / C ++遵循C / C ++语言规则,有些restrictions

    事实上,CUDA(C / C ++)主要实现了一个具有GPU特定扩展的C ++编译器。但是,由于C和C ++之间存在很多共性,我们可以在很多情况下将其称为C / C ++风格的语言。