как синхронизировать функцию ядра cuda? - PullRequest
0 голосов
/ 28 марта 2012

У меня есть две функции ядра cuda, подобные этой

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

После запуска функции a я хочу дождаться завершения функции a, а затем запустить функцию b. поэтому я вставил cudaThreadSynchronize () между a и b следующим образом,

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
err=cudaThreadSynchronize();
if( err != cudaSuccess)
    printf("cudaThreadSynchronize error: %s\n", cudaGetErrorString(err));
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

но cudaThreadSynchronize () возвращает код ошибки: the launch timed out and was terminated cuda error

как я могу это исправить?


Простое объяснение кода:

mmap(sequence file);
mmap(reference file);

cudaMemcpy(seq_cuda, sequence);
cudaMemcpy(ref_cuda,reference);

kernel<<<>>>(params); //find short sequence in reference
cudaThreadSynchronize();
kernel<<<>>>(params);

cudaMemcpy(result, result_cuda);
report result

и в функции ядра есть большой цикл for, который содержит некоторые if-else для алгоритма сопоставления с образцом, чтобы уменьшить количество сравнений.

1 Ответ

1 голос
/ 28 марта 2012

Эта ошибка запуска означает, что что-то пошло не так, когда ваше первое ядро ​​было запущено или, может быть, что-то еще до этого. Чтобы избавиться от этого, попробуйте проверить вывод всех вызовов CUDA во время выполнения на наличие ошибок. Кроме того, выполните cudaThreadSync с последующей проверкой ошибок после всех вызовов ядра. Это должно помочь вам найти первое место, где происходит ошибка.

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

Наконец, обратите внимание, что весьма маловероятно, что ваше действие по добавлению в cudaThreadSynchronize вызвало эту ошибку. Я говорю это потому, что способ, которым вы сформулировали запрос, указывает на cudaThreadSynchronize как на виновника. Все, что сделал этот вызов, было поймать вашу существующую ошибку ранее.

...