Что касается вашей проблемы с передачей двойных указателей: такая проблема обычно решается путем копирования всей матрицы (или того, над чем вы работаете) в один непрерывный блок памяти, и, если блоки имеют разную длину, передают другой массив, который содержит смещения для отдельные строки (так что ваш доступ будет выглядеть примерно как B[index[ii]+i]
).
Теперь для вашего сокращения до Re
: поскольку вы не упомянули, на каком устройстве вы работаете, я предполагаю, что это его графический процессор. В этом случае я бы избегал сокращения в том же ядре, поскольку оно будет чертовски медленным в том виде, как вы его разместили (вам придется сериализовать доступ к Re
по тысячам потоков (и доступ к A[i]
тоже). Вместо этого я бы написал ядро, которое суммирует все B[*][i]
в A[i]
и помещает сокращение от A
до Re
в другом ядре и делает это в несколько этапов, то есть вы используете ядро сокращения, которое работает с элементом n
и сокращает их до чего-то вроде n / 16
(или любое другое число.) Затем вы итеративно вызываете это ядро до тех пор, пока не дойдете до одного элемента, который и является вашим результатом (я намеренно делаю это описание расплывчатым, поскольку вы сказали, что хотите выяснить, что думает самостоятельно).
В качестве примечания: вы понимаете, что в исходном коде нет хорошего шаблона доступа к памяти? Предполагая, что B
относительно большой (и намного больше, чем A
из-за второго измерения), если внутренний цикл итерация по внешнему индексу, создаст много кеш-ошибок. Это еще хуже при портировании на графический процессор, который очень чувствителен к последовательному доступу к памяти.
Таким образом, переупорядочивание может значительно повысить производительность:
for (n2=0; n2< SmallNumber; ++n2)
for(n=0; n < LargeNumber; ++n)
A[n]+=B[n2][n];
for(n=0; n < LargeNumber; ++n)
Re+=A[n];
Это особенно верно, если у вас есть компилятор, который хорошо справляется с автовекторизацией, поскольку он может векторизовать эту конструкцию, но очень маловероятно, что это удастся сделать для исходного кода (и если он не может доказать, что A
и B[n2]
не может ссылаться на ту же самую память, он не может превратить в нее исходный код).
person
Grizzly
schedule
07.01.2012