2012-03-28 3 views
0

У меня есть две функции ядра CUDA, как этотКак синхронизировать функцию ядра cuda?

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

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

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 

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

+0

В форуме CUDA Nvidia (например, [cuda запуск завершен и завершен] (http://forums.nvidia.com/index.php?showtopic=189042)), люди указывают на ядра, которые слишком долго для запуска на графическом процессоре, который также используется для вашего видеодисплея. Решение состоит в том, чтобы сократить ядро ​​или использовать различные графические процессоры (например, встроенную графику) для управления вашим дисплеем. –

+0

Какую операционную систему вы используете? – talonmies

+0

Я использую ubuntu 10.04 – enc

ответ

1

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

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

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

+0

Я проверил все вызовы ядра перед вызовом a, но ошибки не было. , тогда «запуск приурочен и был прерван ошибка cuda» может произойти во время функции a ?? – enc

+0

Enc: Да, должно быть что-то не так с ядром a. Либо его конфигурацию исполнения, либо то, что вы делаете внутри своего ядра. –

+0

спасибо Ашвин. есть ли какие-либо предположения об этой ситуации? я понятия не имею, какой из них вызывает эту проблему. Одна вещь, которую я понимаю, - это то, что когда я использую небольшие данные (~ 10 МБ), она работает хорошо, но я использую более крупные данные (несколько сотен МБ, но вписываются в память на графическую карту), это не работает. – enc

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