Если подумать, 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
только замедлило работу. Как это возможно? Можно ли его ускорить другим способом?