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

How to pause all CUDA threads until thread 0 finished some code?

我在下面有一个简单的 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 提供的唯一方法(在一般情况下,内核启动有超过 1 个块)是通过 cooperative groups grid synchronization. 提供协作组网格范围同步的使用示例。

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

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

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