Различия в производительности pyCUDA против C?
Я новичок в программировании CUDA, и мне было интересно, как производительность pyCUDA сравнивается с программами, реализованными на простом C.
Будет ли производительность примерно одинаковой? Есть ли какие-нибудь бутылочные шеи, о которых я должен знать?
EDIT:
Я, очевидно, попытался сначала разобраться с этой проблемой и был удивлен, не найдя никакой информации. т.е. я бы исключил, что люди pyCUDA ответили на этот вопрос в своем FAQ.
Ответы
Ответ 1
Если вы используете CUDA - прямо через C или с pyCUDA - вся тяжелая численная работа, которую вы делаете, выполняется в ядрах, которые выполняются на gpu и написаны на CUDA C (непосредственно вами или косвенно с элементарными ядрами). Таким образом, не должно быть никакой реальной разницы в производительности в тех частях вашего кода.
Теперь инициализация массивов и любой последующий анализ будут выполняться в python (возможно, с numpy), если вы используете pyCUDA, и, как правило, будет значительно медленнее, чем делать это непосредственно на скомпилированном языке (хотя if вы создали свой numpy/scipy таким образом, чтобы он напрямую связывался с высокопроизводительными библиотеками, тогда эти вызовы, по крайней мере, будут одинаковыми на любом языке). Но, надеюсь, ваша инициализация и финализация - это небольшие доли от общей суммы работы, которую вы должны сделать, так что даже если там будут значительные накладные расходы, она, надеюсь, не окажет большого влияния на общее время выполнения.
И на самом деле, если выяснится, что части вычисления python повредят вашей производительности приложения, начиная с вашей разработки в pyCUDA, возможно, это отличный способ начать работу, поскольку разработка значительно проще, и вы можете всегда повторно реализуйте те части кода, которые слишком медленны в Python в прямом C, и вызывают их из python, получая одни из лучших из обоих миров.
Ответ 2
Если вам интересно узнать о различиях в производительности, используя pyCUDA по-разному, см. SimpleSpeedTest.py, включенную в примеры вики pyCUDA. Он сравнивает ту же задачу, завершенную ядром CUDA C, инкапсулированным в pyCUDA, и несколькими абстракциями, создаваемыми дизайнером pyCUDA. Там разница в производительности.
Ответ 3
Я использую pyCUDA на некоторое время, мне нравится прототипирование с ним, потому что это ускоряет процесс превращения идеи в рабочий код.
С помощью pyCUDA вы будете писать ядра CUDA с использованием С++, и это CUDA, поэтому не должно быть разницы в производительности запуска этого кода. Но будет разница в производительности кода, который вы пишете на Python, для установки или использования результатов ядра pyCUDA по сравнению с тем, который вы пишете в C.
Ответ 4
Убедитесь, что вы используете оптимизацию -O3 и используете nvprof/nvvp для профилирования своих ядер, если вы используете PyCUDA, и хотите получить высокую производительность. Если вы хотите использовать Cuda из Python, PyCUDA - это, вероятно, выбор. Поскольку взаимодействие кода С++/Cuda через Python - это просто ад в противном случае. Вы должны написать множество уродливых оберток. И для интеграции с numpy потребуется еще более сложный программный код.