MATLAB является основным столбцом, но алгоритм может быть реализован для оптимизированной реализации основной строки. В сгенерированном коде, если ваша самая быстрая изменяющаяся размерность не является самым внутренним циклом, то память не объединяется. Часто транспонирование входа матриц может просто исправить эту проблему.
Попробуйте транспонировать данные.
Если ваша задача/размер данных слишком мал, то накладные расходы на перемещение данных в графический процессор (даже если он находится просто на контуре ввода-вывода) могут компенсировать любое увеличение эффективности при запуске на графическом процессоре.
Попробуйте алгоритм с большими размерами данных.
Если вы используете только coder.gpu.kernel
, затем все за пределами цикла переходит к центральный процессор. Чтобы попытаться сохранить большую часть кода на графическом процессоре, рекомендуется использовать обе прагмы. Кроме того, наличие неподдерживаемых функций или любой функции/оператора, который не может запускаться на графическом процессоре, вызывает больше cudaMemcpys
будет сгенерирован.
Использовать coder.gpu.kernelfun
в дополнение к coder.gpu.kernel
Если определенные входы вашей функции точки входа постоянны, оберните их с помощью coder.const
объект. Использование coder.const
объект указывает, что эти переменные являются постоянными во время генерации кода. Без этой функции GPU Coder™ рассматривает эти входы как переменные и, следовательно, обрабатывает все матрицы, размерные по этим переменным, как матрицы переменного измерения. GPU Coder не создает хороших ядер из матриц переменного измерения, так как в настоящее время нет поддержки динамической калибровки ядер или динамической cudaMemcpy
вызовы функций.
Использование памяти большого стека внутри ядер может снизить эффективность сгенерированного кода. При таких условиях рассмотрите переписывание алгоритма другим способом или разбиение его на меньшие расчеты, чтобы уменьшить использование памяти стека и улучшить эффективность.