2014-09-24 3 views
1

Есть ли способ определить количество потоков cuda во время выполнения программы, а не при компиляции? Также как использование «новой» команды. (Далее «Поток» относится к блоку кодов, а не потоки)Есть ли способ динамически определить количество потоков cuda?

Редактировать 1

(В ответ на последний комментарий) Say

for(int i = 0; i < nstreams; ++i) 

    (Some serial code here, not related to kernel or cuda memory copy); 

    someKernel<<<xx, yy, 0, stream[i]>>>(param list); 

end 

Без последовательного кода, ядра должны выполняться в параллельно, если мое понимание правильное?

Но будет ли выполнение ядра одновременно, поскольку серийный код может быть распараллелен i (то есть может быть распараллелен в модуле OpenMP, если его вынуть). Будет ли это влиять на параллелизм?

+0

Я просто попытался команду 'таНос', которая возвращает указатель марки 'cudaStream_t'. Код может компилироваться, но кажется немного странным. Будет ли тест проверять, правильно ли это выполняется. – Fontaine007

ответ

2

Да, количество потоков может быть определено во время выполнения.

int num_streams; 
// ... set num_streams at runtime 
cudaStream_t streams[num_streams]; 
for (int i = 0; i < num_streams; i++) 
    cudaStreamCreate(&(streams[i])); 

Следующие конструкции также работают:

int num_streams; 
// ... set num_streams 
cudaStream_t *streams = (cudaStream_t *)malloc(num_streams*sizeof(cudaStream_t)); 
for (int i = 0; i < num_streams; i++) 
    cudaStreamCreate(&(streams[i])); 

или:

int num_streams; 
// ... set num_streams 
cudaStream_t *streams = new cudaStream_t[num_streams]; 
for (int i = 0; i < num_streams; i++) 
    cudaStreamCreate(&(streams[i])); 
+0

Но «потоки» здесь представляют собой массив, не так ли? Я думаю, что количество элементов должно быть указано во время компиляции? Пробовал ваш код, но он не будет компилироваться, если не используется какой-либо код, например 'const int num_streams = 2'; – Fontaine007

+0

Спасибо, теперь код работает нормально .. – Fontaine007

+0

нет, количество элементов не нужно указывать во время компиляции. Вышеприведенные примеры правильно компилируются для меня без 'const' –

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