gpt4 book ai didi

multithreading - “threadgroup_barrier”没有区别

转载 作者:行者123 更新时间:2023-12-03 13:18:46 24 4
gpt4 key购买 nike

目前,我正在与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
}
}

总结一下:仅当我在一个GPU线程中处理线程组内存时,我的代码才能按预期工作,无论它的ID是什么,它既可以是线程组中的最后一个线程,也可以是第一个线程。而 threadgroup_barrier的存在绝对没有区别。我还使用了 threadgroup_barriermem_threadgroup标志,代码仍然无法正常工作。

我知道我可能会遗漏一些非常重要的细节,如果有人可以指出我的错误,我将很高兴。提前致谢!

最佳答案

当您编写output += blockIndices[...]时,所有线程都将尝试同时执行此操作。但是由于output不是原子变量,因此会导致竞争状态。这不是线程安全的操作。

您的第二个解决方案是正确的。您只需要一个线程即可收集结果(尽管您也可以将其拆分为多个线程)。如果您移除障碍物,它仍然可以正常运行,这可能仅仅是由于运气。

关于multithreading - “threadgroup_barrier”没有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com