如果我不在opencl中使用原子函数,是否需要担心内存损坏?

时间:2013-09-02 18:35:39

标签: opencl atomic

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

我可以安全地玩,但也许有优化。

1 个答案:

答案 0 :(得分:1)

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