rsAtomicIn c медленнее с большим массивом - PullRequest
0 голосов
/ 19 июня 2020

Если подумать, rsAtomicInc вообще не нужен с помощью reduce, я реализую новый метод без него. Мне все еще интересно, почему он медленнее.

^^ Edit ^^

У меня есть ядро ​​с массивом 2D MxN в качестве входных данных, и я хочу массив 1D 1x100 как вывод. Используется это ядро:

void RS_KERNEL calculateShift(uchar4 currentInput, uint x, uint y) {
    for (int shift = 0; shift < 100; shift++) {
        int previousY = y + shift;
        uchar4 previousInput = rsGetElementAt_uchar4(previousScreenshot, x, previousY);

        if (compare(previousInput, currentInput)) {
            rsAtomicInc(&absoluteVerticalShiftArray[shift + height]);

//            uint index = x + width * (shift + height);
//            rsAtomicInc(&precursorAbsoluteVerticalShiftArray[index]);
        }
    }
}

Закомментированный код был предполагаемым улучшением.

Я хотел его ускорить, поэтому моей идеей было заменить absoluteVerticalShiftArray с большим precursorAbsoluteVerticalShiftArray, а затем используйте сокращающее ядро ​​для вычисления absoluteVerticalShiftArray. Поскольку rsAtomicInc является узким местом, увеличение количества указателя должно сократить время ожидания.

       0 1 .. width-1

0   [  0 2      4 ]            [ 6  ]
1   [  5 3      1 ]  reduce -> [ 9  ]
2.  [  2 4      7 ]            [ 13 ]
..   
99. [ 1 1       1 ]            [ 3  ]

precursor...                   absoluteVerticalShiftArray

Промежуточное сегментирование rsAtomicInc для ускорения работы.

Однако использование большего precursorAbsoluteVerticalShiftArray только замедлило работу. Как это возможно? Можно ли его ускорить другим способом?

...