2013-08-10 3 views
0

У меня есть программа 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 секунды, почему? Очень ценится за любые намеки.

+2

Я думаю, вы новичок в переполнении стека. Обычно мы ожидаем, что такие вопросы включают некоторый код. Если ваш код действительно идентичен, неудивительно, что он медленно запускается на графическом процессоре. Вам нужно использовать GPU, запустив много потоков. –

+1

Что делать, если вы дважды вызываете функцию mex в строке вашего кода matlab, все равно занимает 3 секунды каждый раз? –

ответ

1

Ваш вопрос непонятен. Я принимаю следующие условия сравнения:

У вас есть код CUDA, что при компиляции в качестве отдельной программы под Visual Studio, это быстрее, чем когда сопрягается с помощью mexFunction и скомпилирован, который будет вызван при Matlab.

Вы должны знать, что первый вызов mexFunction является «медленным», поскольку контекст CUDA является установка, ядро ​​обрабатывается драйвером, а код загружается в GPU.

Соответственно, чтобы иметь значимую оценку времени выполнения, нужно сначала «разогреть» ядро, вызвав его один раз, а затем выполнить время последующих вызовов. Сроки следует рассчитывать как среднее время для многих вызовов, если код очень быстрый.

+0

@rozyang Было бы хорошо, если бы вы могли ответить на вопрос Роберта. Является ли код mexfile за 3 секунды каждый раз или он «медленный» только в первый раз, когда он зашифрован? Наблюдение: вы синхронизируете вызов функции с помощью таймера C++ ('clock_t'). Ядро запускается асинхронно. Итак, если функция 'a_function_that_calls_a_cuda_kernel' содержит только запуск ядра, значит, вы, вероятно, не правильно синхронизируете его. Вы пытались вызвать вызов ядра API CUDA? Не могли бы вы разместить «минимальный размер», полностью компилируемый код, воспроизводящий проблему, которую кто-то мог бы скомпилировать и запустить? – JackOLantern

Смежные вопросы