CUDA动态并行和全局内存同步

用户名

我不知道以下内容。

如果我启动一个内核和考虑,例如,线程00,一个后__syncthreads()来电,都会在所有其它模块看到线程全局内存所做的更改其他线程00

我的猜测不是。实际上,在《CUDA C编程指南》的同步功能部分中,指出:

void __syncthreads();等待直到线程块中的所有线程都到达这个点,并且这些线程之前的所有全局和共享内存访问对该块中的所有线程__syncthreads()都可见

但是,在谈论动态并行性中的全局内存一致性时,《 CUDA C编程指南》指出:

仅在第二次调用之后,这些修改才对父网格的其他线程可用__syncthreads()

__syncthreads()当涉及动态并行性时还可以使更改跨块可用吗?

谢谢

活力

唯一执行的操作__syncthreads()是CUDA C编程指南中所述的您自己引用的操作除了在多个内核启动中划分内核执行的幼稚方法之外,CUDA中没有办法跨块同步,而在性能方面存在所有缺点。因此,您自己也猜到的第一个问题的答案为否。

在文章的第二部分中,您将参考《 CUDA C编程指南》的特定示例,即

__global__ void child_launch(int *data) {
    data[threadIdx.x] = data[threadIdx.x]+1;
}

__global__ void parent_launch(int *data) { 
    data[threadIdx.x] = threadIdx.x;

    __syncthreads();

    if (threadIdx.x == 0) {
        child_launch<<< 1, 256 >>>(data);
        cudaDeviceSynchronize();
    }

    __syncthreads();
}

void host_launch(int *data) {
    parent_launch<<< 1, 256 >>>(data);
}

在这里,内核的所有256线程都在中parent_launch写入了一些内容data之后,线程0调用child_launch首先__syncthreads()需要确保在子内核调用之前完成所有内存写入。在这一点上引用指南:

由于有第一个__syncthreads()电话,孩子会看到data[0]=0,,data[1]=1... data[255]=255(没有__syncthreads()电话,只能data[0]保证孩子会看到它)。

关于第二个__syncthreads(),《指南》解释说,

当子网格返回时,0保证线程看到其子网格中的线程所做的修改。仅在第二次__syncthreads()调用之后,这些修改才对父网格的其他线程可用

在该特定示例中,第二个__syncthreads()是多余的,因为由于内核终止而存在隐式同步,但是__syncthreads()当在子内核启动之后必须执行其他操作时,第二个就变得很有用。

最后,关于您在帖子中引用的句子:

只有在第二次__syncthreads()调用之后,这些修改才可用于父网格的其他线程

请注意,在特定示例中,该host_launch函数仅启动一个线程块这也许在某种程度上误导了您。

NVIDIA论坛上有一个有趣的讨论(可能甚至超过一个),涉及跨块的线程同步,标题为

同步CUDA中的所有块

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CUDA 对全局内存的低效访问模式

CUDA动态并行中的同步

如何在CUDA中正确添加全局内存?

CUDA内核中的Heisenbug,全局内存访问

在CUDA中访问全局内存的速度很慢

CUDA:使用多个线程访问全局内存

CUDA中的静态分配的全局内存结构

为什么在平铺矩阵乘法中CUDA共享内存比全局内存要慢?

用CUDA中的全局内存初始化共享内存时出错

线程与全局内存的交互

全局内存分段错误

矩阵乘法:在CUDA中合并全局内存访问后,性能下降

CUDA 写入其他经线看不到的全局内存

OpenCL中工作项和全局内存之间的内存传输?

如何找出GPU的共享内存和全局内存大小?

OpenCL中的本地内存围栏和全局内存围栏有什么区别?

如何在CUDA中安全地将全局内存中的数据加载到共享内存中?

GTX Titan Z全局内存

如何从全局内存到本地内存进行跨步复制?

了解CUDA中的动态并行

CUDA中的动态共享内存

将线程本地内存刷新到全局内存是什么意思?

L2 缓存的内存操作是否比 NVIDIA GPU 的全局内存快得多?

1D纹理内存访问是否比1D全局内存访问快?

Opencl - 将全局内存工作组 + 边界转移到本地内存

将数据从全局内存移动到共享内存是否会使线程停止?

CUDA和寻址位并行

从设备全局内存到主机全局内存是否有等同于“ cudaMemcpy”的东西,我可以在设备函数中调用该东西?

CUDA动态并行性和Biot-Savart定律的涡旋分量计算