У меня есть программа CUDA для Matlab, но версия mex намного медленнее версии Visual Studio, хотя код идентичен, за исключением краткой mexFunction для аргументов ввода/вывода. Мексовая версия занимает 3 секунды, а чистый C занимает 0,5 секунды.Тот же код, mex намного медленнее и чисто C, почему?
Я использую карту Quadro K2000M, возможность CUDA 3.0, CUDA Driver 5.5, runtime 5.0, программирование с Visual Studio 2010. Я выполнил шаги для mexGPUExample.cu от MATLAB, изменив настройку на -gencode = arch = compute_30, code = \ "sm_30, compute_30 \" (удаление нижних флагов версии).
В деталях,
Чистый код C (созданный в Nsight 3.1 для визуального проекта Sutdio 2010, изменил генерацию кода для compute_30, sm_30)
int main(int argc, char *argv[]){
clock_t begin, end;
double elapsed_time;
// some codes that prepare parameters from argc and argv
begin = clock();
a_function_that_calls_a_cuda_kernel(parameters);
end = clock();
elapsed_time = (double)(end - begin)/CLOCKS_PER_SEC;
printf("elapsed time: %f seconds\n", elapsed_time);
return 0;
}
Matlab MEX код (следовать mexGPUExample .cu от MATLAB, подробности в http://www.mathworks.se/help/distcomp/create-and-run-mex-files-containing-cuda-code.html, слегка изменили настройку на -gencode = arch = compute_30, code = \ "sm_30, compute_30 \")
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
clock_t begin, end;
double elapsed_time;
// some codes that prepare parameters from prhs
begin = clock();
a_function_that_calls_a_cuda_kernel(parameters);
end = clock();
elapsed_time = (double)(end - begin)/CLOCKS_PER_SEC;
mexPrintf("elapsed time: %f seconds\n", elapsed_time);
}
Мексовая версия занимает 3 секунды, в то время как чистый C занимает 0,5 секунды, почему? Очень ценится за любые намеки.
Я думаю, вы новичок в переполнении стека. Обычно мы ожидаем, что такие вопросы включают некоторый код. Если ваш код действительно идентичен, неудивительно, что он медленно запускается на графическом процессоре. Вам нужно использовать GPU, запустив много потоков. –
Что делать, если вы дважды вызываете функцию mex в строке вашего кода matlab, все равно занимает 3 секунды каждый раз? –