2013-03-15 54 views
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]。这确实有用。

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

回答

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

既然你刚开始的指针元素,使一个新的数组,我相信你能适应这使用动态偏移量代替它们在示例中的静态偏移量。他们还指出,协调必须是相同的,这不应该是你的情况的问题。

+0

一个更美丽的方式来做到这一点,这就是我一直在寻找的。谢谢。 – machlas 2013-03-15 15:20:27

+0

@Imortenson此方法是否支持内存中元素的动态访问对齐的好​​处?如果你已经将内存分配为'sizeof(float)'或者访问将遵循'float' allignment,那么'float4'是否会以'32byte'对齐的方式被访问?谢谢。 – BugShotGG 2014-09-12 11:09:39

+0

在你的例子中,你知道你的数组的大小;那么为什么不定义一个'struct',而是将共享内存重新解释为那个结构? – einpoklum 2017-02-17 23:23:29