Обновление : Следующие результаты относятся к рукописному алгоритму FFT GPU на оборудовании 2005 года (nVidia 7800 GTX), но показывают принцип узких мест передачи CPU-GPU
Накладные расходы - это не сам вызов, а компиляция программы GPU и передача данных между GPU и хостом.Процессор сильно оптимизирован для функций, которые могут выполняться полностью в кэш-памяти, и задержка памяти DDR3 намного ниже, чем шины PCI-Express, которая обслуживает графический процессор.Я испытал это сам, когда писал процедуры FFT на GPU (до CUDA).Пожалуйста, посмотрите этот связанный вопрос .
N FFTw (s) GPUFFT (s) GPUFFT MFLOPS GPUFFT Speedup
8 0 0.00006 3.352705 0.006881
16 0.000001 0.000065 7.882117 0.010217
32 0.000001 0.000075 17.10887 0.014695
64 0.000002 0.000085 36.080118 0.026744
128 0.000004 0.000093 76.724324 0.040122
256 0.000007 0.000107 153.739856 0.066754
512 0.000015 0.000115 320.200892 0.134614
1024 0.000034 0.000125 657.735381 0.270512
2048 0.000076 0.000156 1155.151507 0.484331
4096 0.000173 0.000215 1834.212989 0.804558
8192 0.000483 0.00032 2664.042421 1.510011
16384 0.001363 0.000605 3035.4551 2.255411
32768 0.003168 0.00114 3450.455808 2.780041
65536 0.008694 0.002464 3404.628083 3.528726
131072 0.015363 0.005027 3545.850483 3.05604
262144 0.033223 0.012513 3016.885246 2.655183
524288 0.072918 0.025879 3079.443664 2.817667
1048576 0.173043 0.076537 2192.056517 2.260904
2097152 0.331553 0.157427 2238.01491 2.106081
4194304 0.801544 0.430518 1715.573229 1.861814
В таблице выше показаны временные характеристики реализации FFT на GPU по сравнению с реализацией CPU на основе размера ядра.Для меньших размеров преобладает передача данных в / из графического процессора.Меньшие ядра могут быть выполнены на CPU, некоторые реализации / размеры полностью в кеше.Это делает процессор лучшим выбором для небольших операций.
Если, с другой стороны, вам нужно выполнять большие объемы работы с данными с минимальным перемещением в / из графического процессора, то графический процессор будет опускать процессор вниз.
Что касается измерения эффекта в вашем примере, я бы предложил провести эксперимент, подобный описанному выше.Попробуйте рассчитать FLOPS, рассчитанные для каждого размера матрицы, и запустите тест на процессоре и графическом процессоре для матрицы разных размеров.Выведите в файл CSV размер, время и FLOPS для GPU против CPU.Для любого профилирования убедитесь, что вы выполняете несколько сотен итераций своего кода и все время, а затем делите общее время на итерации, чтобы получить время цикла.Попробуйте использовать матрицы различной формы, если ваш алгоритм позволяет (например, 10x100, а не 100x10).
Используя эти данные, вы можете почувствовать, что такое издержки.Чтобы выяснить это точно, повторите тот же эксперимент, но замените внутренний код шейдера, выполняемый на графическом процессоре, на отсутствие операций (просто скопируйте с входа на выход).
Надеюсь, это поможет,