Поскольку я заканчивал кодирование моего проекта для многоядерного класса программирования, я придумал что-то действительно странное, с которым я хотел обсудить с вами.
Нам было предложено создать любую программу, которая продемонстрировала бы значительное улучшение в программировании для многоядерной платформы. Я решил попробовать что-то на графическом процессоре, чтобы попробовать OpenCL. Ive выбрал матричную задачу свертки, так как Im хорошо знаком с ней (Ive распараллеливал ее раньше с помощью open_mpi с большим ускорением для больших изображений).
Итак, вот, я выбираю большой GIF файл (2.5 MB) [2816X2112], и я запускаю последовательную версию (исходный код), и я получаю в среднем 15,3 секунды.
Затем я запускаю новую версию OpenCL, которую я только что написал на моей MBP-интегрированной GeForce 9400M, и я получаю в среднем 1,26 секунды. Пока все хорошо, его ускорение 12X!
Но теперь я зашел в свою панель энергосбережения, чтобы включить "Графический режим производительности". Этот режим отключает GeForce 9400M и включает Geforce 9600M GT в моей системе. Apple говорит, что эта карта в два раза быстрее встроенной.
Угадайте, что мое время, использующее графическую карту kick-ass, составляет в среднем 3,2 секунды... Мой 9600M GT кажется более чем в два раза медленнее, чем 9400M.
Для тех из вас, кто настроен на OpenCL, я копирую все данные в удаленные буферы перед запуском, поэтому фактическое вычисление не требует округления к главному RAM. Кроме того, я разрешаю OpenCL определять оптимальную локальную работу, поскольку Ive читает, что они сделали довольно хорошую реализацию при вычислении этого параметра.
У кого есть ключ?
edit: полный исходный код с make файлами здесь http://www.mathieusavard.info/convolution.zip
cd gimage
make
cd ../clconvolute
make
put a large input.gif in clconvolute and run it to see results