我有一个内核,每次执行时我都可以将结果写入输出数组。
所有LowerValues[]
都将被初始化为一个幻数,以查看它是否未受影响。
我不关心LowerValues[N]
中的哪个值,只要它有效。
kernel void HasLower( global int* Values, global int* LowerValues )
{
int ThisIndex = get_global_id(0);
int Max = get_global_size(0);
int ThisValue = Values[Index];
for ( int ThatIndex=ThisIndex+1; ThatIndex<Max; ThatIndex++ )
{
int ThatValue = Values[ThatIndex];
if ( ThatValue < ThisValue )
{
LowerValues[ThisValue] = ThatValue;
}
else if ( ThatValue > ThisValue )
{
LowerValues[ThatValue] = ThisValue;
}
}
}
我的多线程头说,使用原子函数在LowerValues[]
中设置值,这样当两个线程写入同一个内存位置时,内存不会被破坏。
但......我想知道的是,我是否需要使用原子功能? 我不在乎一个执行是否覆盖另一个,但我不想要损坏的值。这是我需要关注opencl的东西吗?它依赖于驱动程序/设备吗? 我找不到任何与此有关的信息,到目前为止,当我省略原子时,没有遇到任何内存损坏。
我可以安全地玩,但也许有优化。
答案 0 :(得分:1)
你不需要使用原子函数,因为基本类型的基本操作在内存中有这么多的副作用。但是,正如您已经猜到的那样,多个线程会发现他们的ThisValue&lt;值[idx]和LowerValues [ThatValue]必须被视为真实答案的随机,不可重复的选择。