Я новичок в программировании на 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 эти общие трюки автоматически или нет?