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