有没有办法为共享内存阵列设置默认值?

时间:2011-06-25 13:42:14

标签: cuda

请考虑以下代码:

__global__ void kernel(int *something) {
extern __shared__ int shared_array[];     

// Some operations on shared_array here.

}

是否可以将整个shared_array设置为某个值 - 例如0 - 没有明确地在某个线程中寻址每个单元格?

3 个答案:

答案 0 :(得分:13)

您可以像这样有效地并行初始化共享阵列

// if SHARED_SIZE == blockDim.x, eliminate this loop
for (int i = threadIdx.x; i < SHARED_SIZE; i += blockDim.x) 
    shared_array[i] = INITIAL_VALUE;
__syncthreads();

答案 1 :(得分:11)

没有。共享内存未初始化。你必须以某种方式自己初始化它......

从CUDA C编程指南3.2,B.2.4.2节,第2段:

  

__shared__个变量不能作为声明的一部分进行初始化。

这也会丢弃共享变量的非平凡构造函数。

答案 2 :(得分:1)

是的,你可以。您可以指定块中的第一个线程设置它,而另一个线程不设置它:

extern __shared__ unsigned int local_bin[]; // Size specified in kernel call

if (threadIdx.x == 0) // Wipe on first thread - include " && threadIdx.y == 0" and " && threadIdx.z == 0"  if threadblock has 2 or 3 dimensions instead of 1.
{
    // For-loop to set all local_bin array indexes to specified value here - note you cannot use cudaMemset as it translates to a kernel call itself
}

// Do stuff unrelated to local_bin here    

__syncthreads(); // To make sure the memset above has completed before other threads start writing values to local_bin.

// Do stuff to local_bin here

理想情况下,你应该在syncthreads调用之前做尽可能多的工作,因为这允许所有其他线程在memset完成之前完成它们的工作 - 显然这只有在工作有可能有完全不同的线程时才有意义完成时间,例如,如果存在条件分支。 请注意,对于线程0“设置”for循环,您需要将local_bin数组的大小作为参数传递给内核,以便您知道要迭代的数组的大小。

Original concept source