2013-09-02 3 views
0

У меня возникли проблемы с попыткой четко определить структуру моего кода CUDA. Мой код делится на две фазы: во-первых, мне нужно выполнить операции M * N, а результаты их используются в других N-операциях. Чтобы воспользоваться преимуществами CUDA, я задаюсь вопросом, можете ли вы иметь два уровня параллелизма. Во-первых, инструкция с dimGrid (N * M/dimBlock.x, N * M/dimBlock.y), а затем другая с dimGrid (N/dimBlock.x, N/dimBlock.y).Cuda: Изменение размера сетки во время выполнения

+0

Если «инструкция» означает «запуск ядра», вы можете запустить одно и то же ядро ​​с разными блоками на каждую сетку и потоками на блок. – JackOLantern

ответ

0

Да, вы можете запускать ядра с разными размерами сетки/конфигурациями на графическом процессоре. Это верно ли вы запускаете то же ядро:

dim3 dimBlock(block_x, block_y); 
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y); 
mykernel<<<dimGrid1, dimBlock>>>(...); 
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y); 
mykernel<<<dimGrid2, dimBlock>>>(...); 

или разные ядра:

dim3 dimBlock(block_x, block_y); 
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y); 
mykernel1<<<dimGrid1, dimBlock>>>(...); 
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y); 
mykernel2<<<dimGrid2, dimBlock>>>(...); 

Существует также то, что называется CUDA dynamic parallelism, который позволяет сделать следующее, но это требует GPU в вычислительных способность 3,5:

__global__ void kernel2(...){ 
... 
} 

__global__ void kernel1(...){ 
... 
dim3 dimBlock(block_x, block_y); 
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y); 
kernel2<<<dimGrid, dimBlock>>>(...); 
... 
} 

и с динамическим параллелизмом это даже можно назвать и то же ядро ​​рекурсивно:

__global__ void kernel1(...){ 
... 
dim3 dimBlock(block_x, block_y); 
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y); 
kernel1<<<dimGrid, dimBlock>>>(...); 
... 
} 
+0

Большое спасибо за ваш быстрый ответ. Я использую TESLA C2075, поэтому я не могу использовать динамический параллелизм. – user2739435

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