В большинстве приложений вы должны делать cudaMalloc один раз, а затем больше не вызывать его. Таким образом, узким местом действительно является cudaMemcpy.
Это связано с физическими ограничениями. Для стандартного канала PCI-E 2.0 x16 вы получите теоретическую скорость 8 ГБ / с, но на практике обычно 5-6 ГБ / с. Сравните это с Fermi среднего класса, например GTX460, с пропускной способностью 80 + ГБ / с на устройстве. По сути, вы используете порядок пропускной способности памяти, увеличивая время передачи данных.
Предполагается, что GPGPU являются суперкомпьютерами, и я считаю, что Сеймур Крэй (специалист по суперкомпьютерам) сказал: «Суперкомпьютер превращает проблемы, связанные с вычислениями, в проблемы, связанные с вводом / выводом». Таким образом, оптимизация передачи данных - это все.
По моему личному опыту, итеративные алгоритмы - это те, которые на сегодняшний день демонстрируют наилучшие улучшения при портировании на GPGPU (2-3 порядка) благодаря тому, что вы можете исключить время передачи, сохраняя все на месте на GPU.