Я новичок в программировании на GPU, но поскольку у меня есть задача с интенсивными вычислениями, я обратился к GPU для возможного увеличения производительности.
Я попытался переписать свою программу с помощью версии ArrayFire Free. Это действительно быстрее, чем моя процедура ЦП с включенной многопоточностью, но не в той степени, которую я ожидал (то есть <100% ускорение), и возвращаемые результаты не совсем правильные (<1% ошибка по сравнению с процедурой ЦП, предполагая, что результаты процедуры CPU верны).
Моя задача - это в основном поэлементные математические операции с плавающей запятой-32 над большими матрицами (размером 300-500 МБ) с небольшими случаями if-thens / switch и т. Д. Я предполагаю, что узким местом производительности является пропускная способность между ЦП и памятью графического процессора, поскольку существует много чтения данных и т. д. Я тестировал графический процессор GeForce 580GTX с 3 ГБ видеопамяти.
Есть ли еще какие-то значительные возможности для оптимизации, если я напишу необработанный код CUDA (с CUBLAS и т. Д. И средней оптимизацией) вместо использования ArrayFire для моей задачи? Я прочитал несколько руководств по оптимизации NVIDIA; похоже, что есть некоторые уловки с доступом к памяти для более быстрого доступа к данным и уменьшения конфликтов банков. Использует ли ArrayFire эти общие приемы автоматически или нет?