0

В сценарии рендеринга я использую связанные указатели для итерации по большому изображению. Проблема заключается в производительности доступа к массиву.Ошибка использования указателя указателя стиля C++

... 
for(int i=0; i < channels; i++) { 
    sum += (input[i*input_size]) * mulValue; 
} 
... 

Например, когда input_size является 12288 он занимает 1,5 секунды, чтобы закончить сценарий, но когда это input_size 12280 это занимает ~ 0,5 секунды.

Что может вызвать такое тайное поведение?

+0

Убедитесь, что вы не получаете доступ к нему за пределы. Кроме того, предпочитают функции rsGetElementAt_ * привязывать указатели. – sakridge

+0

@sakridge Array слишком большой, но я не получаю доступ к нему вне диапазона. Может ли это быть результатом кэширования? – Vardan95

+0

Может быть. Возможно, этот размер заставляет ваш алгоритм превышать один из уровней кеша. Другое дело, что более медленный размер больше согласован, что может вызвать больше конфликтов с банками, но разница в 3 раза кажется чрезмерной. Можете ли вы попробовать развертку кучи разных размеров? – sakridge

ответ

1

Понимание влияния производительности на то, что вы пишете в RenderScript (или openCL), является сложным.

Просто записывать его в RendersScript не гарантирует производительность. Много раз вы сталкиваетесь с проблемами когерентности кеша, когда ваш доступ к памяти ускоряет ход.

Довольно часто лучше структурировать код как ряд ядер, которые обрабатываются в кеш-дружественной манере.

Извините, если это неясно. В квесте недостаточно информации.