对两个不同的向量使用动态共享内存分配

时间:2013-03-15 14:58:50

标签: cuda

在内核函数中,我想要两个共享内存向量,长度均为size(实际为sizeof(float)*size)。

由于如果需要变量,不可能直接在内核函数中分配内存,我必须动态分配它,如:

    myKernel<<<numBlocks, numThreads, 2*sizeof(float)*size>>> (...);  

并且,在内核中:

extern __shared__ float row[];
extern __shared__ float results[];    

但是,这不起作用。

而不是这个,我只使用分配的extern __shared__ float rowresults[]内存,只包含一个包含所有数据的向量2*size。因此row来电仍然相同,而results来电则为rowresults[size+previousIndex]。这确实有效。

这不是一个大问题,因为无论如何我得到了我期望的结果,但有没有办法将我动态分配的共享内存分成两个(或更多)不同的变量?只是为了美丽。

1 个答案:

答案 0 :(得分:9)

C Programming guide section on __shared__包括从动态分配的共享内存中分配多个数组的示例:

extern __shared__ float array[];
__device__ void func()      // __device__ or __global__ function
{
    short* array0 = (short*)array; 
    float* array1 = (float*)&array0[128];
    int*   array2 =   (int*)&array1[64];
}

由于您只是获取指向元素的指针并使其成为新数组,我相信您可以调整它以使用动态偏移而不是示例中的静态偏移。他们还注意到对齐必须相同,这在您的情况下不应该是一个问题。