CUDA - это модель программирования , параллельная данным , для эффективной архитектуры SIMD, поэтому она не такая гибкая, как универсальная многопоточная или MIMD-архитектура.Конечно, ядра могут быть намного более сложными, чем простые арифметические операции.
В своей собственной работе я часто использую CUDA для решения уравнений в частных производных (то есть методов конечных элементов, конечных разностей и конечных объемов), в которых каждый поток обрабатывает ячейку или элемент из дискретного континуума.При таком расчете существует множество FLOP на поток на ячейку / элемент.
Ключевая область, о которой следует помнить, - дивергенция ветвей.Поскольку это внутренняя архитектура SIMD, код с большим количеством ветвлений в пределах потока (который по сути является шириной SIMD) будет страдать от снижения производительности.Но расхождение ветвей и сложность кода не обязательно должны быть синонимами, вы можете написать очень «ветвистый» и «зацикленный» код, который будет работать хорошо, если потоки в пределах любой данной деформации не слишком часто расходятся.В тяжелых алгоритмах FLOP и IOP это обычно не так сложно достичь.