13

在内核函数中,我想要两个共享内存向量,两者都有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]. 这确实有效。

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

4

1 回答 1

12

__shared__ 上的C 编程指南部分包括从动态分配的共享内存分配多个数组的示例:

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];
}

由于您只是获取指向元素的指针并将其创建为新数组,因此我相信您可以对其进行调整以使用动态偏移量而不是示例中的静态偏移量。他们还指出,对齐方式必须相同,这在您的情况下应该不是问题。

于 2013-03-15T15:09:47.793 回答