CUDA中的线程同步
Threads syncronization in CUDA
我有一个3D块的3D网格,在每个块中,我需要按顺序计算块的"z"层。换句话说,我想首先执行所有(x,y,0)线程,然后执行所有(x,y,1),等等。我需要一层一层地执行我的线程(按z轴计数层)。我知道函数__syncthreads(),但我不知道如何以我想要的方式同步线程。
乌利希期刊指南:
__global__ void Kernel(//some params)
{
//some code
__syncthreads();
}
它同步块中的所有线程。但是我需要执行所有z= 0的线程,然后是所有z=1的线程,等等
您可以使用一个简单的循环,并指定您希望在每次迭代中完成工作的线程。比如:
for (int z = 0; z < zmax; z++) {
if (threadIdx.z == z) {
//do whatever with x and y
}
__syncthreads();
}
在每次迭代中,具有特定z-index的线程执行指令,而其他线程空闲;在每次迭代结束时,所有线程同步。
__syncthreads()
阻塞块内的线程。如果您坚持使用__syncthreads()
,则必须确保块大小与a(x*y)相同,这是不可能的,即使这样,块的顺序也不能保证。实现目标的另一种方法是每层启动一个内核,并在内核之间同步(即块内核并发)。当然,这真的取决于你的内核是做什么的,以及像这样分解它是否可行。
相关文章:
- 在C++中同步线程
- 将 10 个线程与原子布尔值同步
- 线程过程中的线程同步问题
- 如何定期同步线程?
- 同步线程安全的API,用于暴露缓存数据
- 如何在 pthreads 中正确同步线程
- 通过shared_ptr同步:线程清理器误报
- 如何同步线程以捕获相同数量的帧
- 同步线程和信号
- 使用条件变量(监视器)同步线程
- 同步线程创建和销毁(静态)对象
- NVIDA的CUDA"__syncthreads()"在传统C++中的等价物是什么。如何专业地同步线程?
- 使用事件同步线程
- 如何同步线程(消费者/生产者)
- 以最优雅的方式同步线程
- 使用互斥锁同步线程
- 计算着色器-如何全局同步线程
- GPU for loops:避免扭曲发散和隐式同步线程
- 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止