【发布时间】:2011-06-25 13:42:14
【问题描述】:
考虑以下代码:
__global__ void kernel(int *something) {
extern __shared__ int shared_array[];
// Some operations on shared_array here.
}
是否可以将整个 shared_array 设置为某个值 - 例如0 - 没有明确解决某个线程中的每个单元格?
【问题讨论】:
标签: cuda
考虑以下代码:
__global__ void kernel(int *something) {
extern __shared__ int shared_array[];
// Some operations on shared_array here.
}
是否可以将整个 shared_array 设置为某个值 - 例如0 - 没有明确解决某个线程中的每个单元格?
【问题讨论】:
标签: cuda
您可以像这样有效地并行初始化共享数组
// 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();
【讨论】:
没有。共享内存未初始化。您必须以某种方式自己初始化它...
来自 CUDA C 编程指南 3.2,B.2.4.2 节,第 2 段:
__shared__变量不能将初始化作为其声明的一部分。
这也会丢弃共享变量的重要默认构造函数。
【讨论】:
是的,你可以。您可以指定块中的第一个线程设置它,而另一个不设置它例如:
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 数组的大小作为参数传递给内核,以便知道您正在迭代的数组的大小。
【讨论】: