Подтвердить что ты не робот

ArrayFire против сырого программирования CUDA?

Я новичок в программировании на GPU, но поскольку у меня есть вычислительно интенсивная задача, я перешел на GPU для повышения производительности.

Я пробовал переписывать свою программу с помощью ArrayFire Free. Это действительно быстрее, чем моя подпрограмма CPU с включенной многопотоковой обработкой, но не в той степени, в которой я ожидал (т.е. < 100% speedup), и возвращаемые результаты не совсем правильные (погрешность в 1% по сравнению с процедурой CPU, предполагая, что результаты процедуры ЦП корректны).

Моя задача - это, в основном, элементарные операции с плавающей запятой-32 для больших матриц (размер 300 МБ-500 МБ), с небольшими if-thens/switch-cases и т.д. Я думаю, что узким местом производительности, вероятно, является пропускная способность между памятью процессора и GPU так как есть много данных для чтения и т.д. Я тестировал GPU, это GeForce 580GTX с 3 ГБ видеопамяти.

Есть ли еще какая-то значительная возможность для оптимизации, если я пишу исходный код CUDA (с CUBLAS и т.д. и среднюю оптимизацию) вместо использования ArrayFire для моей задачи? Я прочитал несколько руководств по оптимизации NVIDIA; кажется, что есть некоторые трюки с доступом к памяти для ускорения доступа к данным и уменьшения банковских конфликтов. Использует ли ArrayFire эти общие трюки автоматически или нет?

4b9b3361

Ответ 1

Спасибо за сообщение. Рад услышать, что начальные результаты дали некоторое ускорение. Я работаю над ArrayFire и могу прослушивать здесь свои вопросы.

В первую очередь, код действительно нужен здесь, чтобы кто-нибудь мог помочь с определенностью. Можете ли вы поделиться кодом, который вы написали?

Во-вторых, вы должны думать о CUDA и ArrayFire следующим образом: CUDA - это способ программирования графического процессора, который предоставляет вам возможность писать любой желаемый графический процессор. Но существует огромная разница между наивным кодом CUDA (часто медленнее, чем у процессора) и экспертом, с учетом времени, с ручным оптимизированным кодом CUDA. ArrayFire (и некоторые другие библиотеки графического процессора, такие как CUBLAS) имеют много человеко-лет оптимизаций, вливаемых в них, и, как правило, будут давать лучшие результаты, чем большинство обычных людей успеют достичь самостоятельно. Тем не менее, существует также изменчивость в том, насколько хорошо кто-то использует ArrayFire (или другие библиотеки). Существуют переменные, которые можно и нужно настраивать при использовании вызовов библиотеки ArrayFire, чтобы получить максимальную производительность. Если вы разместите свой код, мы можем помочь вам поделиться некоторыми из них.

В-третьих, ArrayFire использует CUBLAS в функциях, которые полагаются на BLAS, поэтому вы вряд ли увидите большую разницу, используя CUBLAS напрямую.

В-четвертых, да, ArrayFire использует все оптимизации, доступные в Руководстве по программированию NVIDIA CUDA (например, более быстрая передача данных и уменьшение конфликтов банка памяти, как вы упомянули). То, где основная часть развития ArrayFire сосредоточена, на оптимизацию такого рода вещей.

Наконец, несоответствия данных, которые вы заметили, скорее всего, вызваны тем, что компьютерные вычисления против GPU. Поскольку они разные устройства, вы часто увидите несколько разные результаты. Это не то, что процессор дает лучшие результаты, чем графический процессор, а скорее то, что они работают с конечным количеством точности несколькими разными способами. Если вы используете одноточную, а не двойную, вы можете подумать об этом. Проводка кода также поможет нам в этом.

Счастливый, чтобы развернуть мой ответ после публикации кода.