0

我有一个内核,每次执行我都可以将结果写入输出数组。所有这些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的事情吗?它依赖于驱动程序/设备吗?我找不到与此相关的任何信息,并且到目前为止,当我省略原子时,还没有遇到任何内存损坏。

我可以安全地玩它,但也许需要进行优化。

4

1 回答 1

1

不需要使用原子函数,因为对基本类型的基本操作会在内存中产生副作用。但是,正如您已经猜到的那样,多个线程会发现它们的 ThisValue < Values[idx] 和 LowerValues[ThatValue] 必须被视为随机的、不可重复的真实答案选择。

于 2013-09-02T18:50:35.933 回答