2015-07-06 3 views
0

Когда блок ядра запускается с хоста, он имеет размер основы 32. Является ли это тем же самым для дочерних ядер, запущенных с помощью динамического параллелизма? Мое предположение было бы да, но я не видел его в документах.Имеют ли ядра ядра ядра ядра такие же размеры основы, как ядра с запуском ядра?

Больший вопрос, конечно же, стоит ли: стоит ли?

__global__ void kernel(const int * vec, float * outvec){ 
    int idx = threadIdx.x; 
    float random_sum=0; 
    for(int j=0; j<vec[idx]; j++){ 
     random_sum+=threadsafe_rand_uniform(); 
    } 
    outvec[idx] = random_sum; 
} 

Хорошо, этот пример является надуманным. Дело в том, что если у вас есть петля разной длины от потока к потоку, возникает соблазн попробовать и динамически распараллелить ее. Однако, если деформация все равно 32, вы в конечном итоге тратите много процессоров на искажения неравномерных размеров. В этом конкретном примере вы можете сначала отсортировать данные, а затем отправить динамически параллелизуемые индексы в одном ядре и индексы плохо сформированной формы в другой.

+0

Вы уже ответили на свой второй/более крупный вопрос в вопросе, верно? –

+0

Предполагая, что нет никакой гибкости в размере основы, для этого конкретного случая, я так думаю. – mmdanziger

+1

Размер Warp - это аппаратное ограничение. Он не поддается изменению. –

ответ

1

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

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

Возможно, вы думали о количестве потоков в ядре, а не о размере деформации? Если это так, то нет, они не обязательно одинаковы. Вы запускаете новое ядро ​​с динамическим параллелизмом точно так же, как вы запустите его от хоста:

<<<blocks, threads>>>threadsafe_rand_uniform(); 

Учтите, что это не то же самое, как только вызов функции устройства, которое является то, что вы сейчас делаете.

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

+0

Спасибо. Я имел в виду деформацию. Потому что, если у вас меньше 32 итераций (или не целое число, равное 32), у вас будет сложность заполнения основы и, следовательно, потеря эффективности. – mmdanziger