如何暂停所有CUDA线程,直到线程0完成一些代码



下面有一个简单的CUDA代码。我的问题是,当线程0初始化数组数据时,如何使所有线程暂停。因此,在此之后,所有线程都可以访问数据中的元素。

__device__ int *data;
__global__ void test() {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx == 0) {
data = (int *) malloc(10 * sizeof (int));
}
data[idx] = idx;
printf("%d", data[idx]);
}
int main() {
test << <1, 10 >> >();
return 0;
}

CUDA提供的唯一方法(在一般情况下,内核启动有一个以上的块(是通过协作组网格同步。这个答案提供了一个使用协作组网格范围同步的示例。

由于使用协作组非常复杂,因此在启动内核之前,您可能需要考虑在主机代码中初始化该指针。这个答案说明了如何做到这一点。

在您的特定情况下,如果您只启动一个块,您可以只使用__syncthreads():

if (idx == 0) {
data = (int *) malloc(10 * sizeof (int));
}
__syncthreads();
data[idx] = idx;
printf("%d", data[idx]);

最新更新