作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在与Metal计算着色器合作,并试图了解GPU线程同步在此处的工作方式。
我写了一个简单的代码,但是它不能按我期望的方式工作:
考虑我有threadgroup
变量,它是所有线程可以同时产生输出的数组。
kernel void compute_features(device float output [[ buffer(0) ]],
ushort2 group_pos [[ threadgroup_position_in_grid ]],
ushort2 thread_pos [[ thread_position_in_threadgroup]],
ushort tid [[ thread_index_in_threadgroup ]])
{
threadgroup short blockIndices[288];
float someValue = 0.0
// doing some work here which fills someValue...
blockIndices[thread_pos.y * THREAD_COUNT_X + thread_pos.x] = someValue;
//wait when all threads are done with calculations
threadgroup_barrier(mem_flags::mem_none);
output += blockIndices[thread_pos.y * THREAD_COUNT_X + thread_pos.x]; // filling out output variable with threads calculations
}
output
上时得出的值。在我看来,
threadgroup_barrier
绝对不起作用。
blockIndices[thread_pos.y * THREAD_COUNT_X + thread_pos.x] = someValue;
threadgroup_barrier(mem_flags::mem_none); //wait when all threads are done with calculations
if (tid == 0) {
for (int i = 0; i < 288; i ++) {
output += blockIndices[i]; // filling out output variable with threads calculations
}
}
blockIndices[thread_pos.y * THREAD_COUNT_X + thread_pos.x] = someValue;
if (tid == 0) {
for (int i = 0; i < 288; i ++) {
output += blockIndices[i]; // filling out output variable with threads calculations
}
}
threadgroup_barrier
的存在绝对没有区别。我还使用了
threadgroup_barrier
和
mem_threadgroup
标志,代码仍然无法正常工作。
最佳答案
当您编写output += blockIndices[...]
时,所有线程都将尝试同时执行此操作。但是由于output
不是原子变量,因此会导致竞争状态。这不是线程安全的操作。
您的第二个解决方案是正确的。您只需要一个线程即可收集结果(尽管您也可以将其拆分为多个线程)。如果您移除障碍物,它仍然可以正常运行,这可能仅仅是由于运气。
关于multithreading - “threadgroup_barrier”没有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709877/
目前,我正在与Metal计算着色器合作,并试图了解GPU线程同步在此处的工作方式。 我写了一个简单的代码,但是它不能按我期望的方式工作: 考虑我有threadgroup变量,它是所有线程可以同时产生输
我是一名优秀的程序员,十分优秀!