c - 我如何避免这种原子操作的竞争条件?
问题描述
以下面的代码片段为例:
__global__ void my_kernel(float *d_min, uint32_t *d_argmin, float *d_input, uint32_t N)
{
uint32_t ii = blockDim.x * blockIdx.x + threadIdx.x;
if (ii>=N)
return;
float cost_ii = someCostFunction( d_input[ii] );
float old_val = atomicMin( d_min, cost_ii );
if (old_val != cost_ii)
{
*d_argmin = ii;
}
}
让我们假设d_min
由调用者初始化说,9999.9
。线程 0 计算较小的成本100.0
,并安全地自动调整最小值。同时,在另一个线程块中,cost_ii
计算出另一个线程块,结果为cost_ii = 10.0
。它阻塞atomicMin
指令,然后设置它。
所以分配给的顺序d_min
如下:
d_min = 9999.9 // from external initialization
d_min = 100.0 // from thread 0 in block 0
d_min = 10.0 // from thread 0 in block 1
但后面的if
语句以不同的顺序执行:
d_argmin = 1024 // from thread 0 in block 1
d_argmin = 0 // from thread 0 in block 0
如何避免atomicMin()
执行时间和d_argmin
设置时间之间的竞争条件。
解决方案
推荐阅读
- html - CSS,首选最小宽度的成语
- javascript - npm start 有 tailwind.js 弹出错误 800A0404 jScript 编译错误然后空白浏览器屏幕
- excel - 查看是否存在 excel 文件
- amazon-web-services - AWS 负载平衡未解析到 EC2 服务器
- google-classroom - Google Classroom API 说它已被禁用,但实际上并非如此
- caching - 无法绕过 Cloudflare 中我的 API 的动态状态缓存
- delphi - TIdHTTP 发布到 API 并将响应保存为 .pdf 文件
- python - 如何直接从 URL 读取大量 HDF5 文件目录到 Python?
- javascript - 引导表按钮多次触发 onlick
- android - 如何将一个文本放在另一个文本下方?- 颤振