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

Привет, когда я собираю с nvcc -arch=sm_13 Я получил:

ptxas info    : Used 29 registers, 28+16 bytes smem, 7200 bytes cmem[0], 8 bytes cmem[1] 

когда я использую nvcc -arch=sm_20 Я получил:

ptxas info    : Used 34 registers, 60 bytes cmem[0], 7200 bytes cmem[2], 4 bytes cmem[16] 

Я думал, что все параметры ядра передаются в общую память, но для sm_20 это не так...?! Возможно, они также передаются в регистры? Глава моей функции выглядит следующим образом:

__global__ void func(double *, double , double, int)

Пока спасибо!

2 ответа

Решение

В устройствах с вычислительной возможностью 2.x аргументы ядра хранятся в постоянной памяти. Разница в регистре, вероятно, связана с различиями в коде, сгенерированном для функций математической библиотеки между версиями. Есть ли такие вещи, как трансцендентные функции или sqrt в ядре?

Как утверждает @talonmies, различия в разделяемой памяти связаны с тем, что устройства SM 2.x передают аргументы ядра через постоянную, а не разделяемую память.

Однако одно из основных отличий в использовании регистров в устройствах SM 2.x заключается в том, что, хотя устройства SM 1.x имеют выделенные регистры адресов для команд загрузки и хранения, SM 2.x использует регистры общего назначения для адресов. Это ведет к увеличению давления в регистре SM 2.x. К счастью, файл регистра также в 2 раза больше на GF100 (SM 2.0) по сравнению с GT200 (SM 1.3).

Другие вопросы по тегам