为什么这段 cuda 的并行前缀算法不会数据竞争

5 小时 51 分钟前
 rungo

比如在 iter=1 这一轮的时候,同时会写入和读取 sum_buf[1]

naive_ker = SourceModule(""" 
                         __global__ void naive_prefix(double *vec, double *out) 
                         {  
                             __shared__ double sum_buf[1024];   
                             int tid = threadIdx.x;   
                             sum_buf[tid] = vec[tid]; 
                               
                             int iter = 1;  
                             for (int i=0; i < 10; i++)  
                             {  
                                 __syncthreads();  
                                 if (tid >= iter )  
                                 {  
                                     sum_buf[tid]= sum_buf[tid] + sum_buf[tid - iter];   
                                 }   
                                 iter *= 2;  
                             }  
                             __syncthreads(); 
                             out[tid] = sum_buf[tid];  
                             __syncthreads();  
                         }     
                         """) 
 naive_gpu = naive_ker.get_function("naive_prefix")
351 次点击
所在节点    Python
4 条回复
r6cb
5 小时 36 分钟前
你这都是写入到 sum_buf[tid],每个线程 tid 不同,怎么会和其他线程冲突呢
rungo
5 小时 27 分钟前
@r6cb 比如 iter=1 时, tid=2 线程会读取 sum_buf[1] ,tid=1 线程会写入 sum_buf[1]
flyqie
4 小时 44 分钟前
好奇 AI 对这种问题的解释怎么样?

感觉现在 AI 应该对这种还算"聪明"?
rungo
4 小时 29 分钟前
@flyqie 问了几个 ai 不能统一,这段代码我从书上抄过来的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1225136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX