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