CUDA - визуальный профилировщик и расхождение потока управления
Я профилирую свое приложение CUDA и наткнулся на то, чего я не понимаю в метрике "Расхождение потока управления", присутствующей в Visual Profiler.
Согласно Руководству пользователя:
Расхождение потока управления дает процент инструкций потока, которые не были выполнены всеми потоками в деформации, следовательно вызывая расхождение.
У меня есть следующий код в моем ядре CUDA:
int var;
var = tex2D(texture, x, y); // texture fetch
if(var < 0) {
var *= -1;
results[(blockIdx.x*blockDim.x) + threadIdx.x] = var; // global memory array
}
Вот что происходит: ни один поток не входит в ветвь (я проверил значения в глобальной памяти), но профилировщик утверждает, что расхождение потока управления составляет 34%. Если в той же ветке я вставлю printf, то значение увеличится до 43% (и, как ни странно, время выполнения также увеличится), несмотря на то, что ничего не происходит в stdout. Означает ли это, что метрика учитывает все инструкции ядра, даже те, которые не выполняются каким-либо потоком? (так эффективно, не имея расхождения деформации)
В обоих случаях показатель расходящихся ветвей равен 0%.
1 ответ
Какую версию ты используешь? Похоже, вы используете старую версию, поэтому, возможно, стоит обновить ее до более новой версии (например, 4.2 или 5.0 - последняя в настоящее время является кандидатом на выпуск).
Если вам удастся обновить CUDA 5.0 до Visual Profiler, то, проанализировав конкретное ядро, вы можете сделать так, чтобы профилировщик выделил определенные строки в вашем ядре, которые страдают от расхождения (то же самое для не слитых обращений к памяти). Вам нужно будет скомпилировать ваш код либо с помощью debug (-G), либо, если вы хотите профилировать код выпуска, с информацией о строке (-lineinfo), чтобы это работало.