Очень простая функция cuda __device__
__device__ __noinline__ int add(int a, int b) {
return a + b;
}
переводит на следующий ptx в cuda toolkit 5.5 с таргетингом на sm_30:
.func (.reg .u32 %rv1) _Z3addii (.reg .u32 %ra1, .reg .u32 %ra2)
{
.reg .u32 %r<4>;
.loc 15 1 0
$LDWbegin__Z3addii:
mov.s32 %r1, %ra1;
mov.s32 %r2, %ra2;
.loc 15 2 0
add.s32 %rv1, %r1, %r2;
ret;
$LDWend__Z3addii:
}
и следующий ptx на cuda toolkit 9.0 с таргетингом на sm_30:
.func (.param .b32 func_retval0) _Z3addii(
.param .b32 _Z3addii_param_0,
.param .b32 _Z3addii_param_1
)
{
.reg .b32 %r<4>;
ld.param.u32 %r1, [_Z3addii_param_0];
ld.param.u32 %r2, [_Z3addii_param_1];
add.s32 %r3, %r2, %r1;
st.param.b32 [func_retval0+0], %r3;
ret;
}
поэтому мне было интересно, почему параметры выбираются и возвращаются через регистры .u32 или .b32 вместо непосредственного использования регистров .s32? И почему инструментарий 9.0 производит использование регистров .u32 для копирования из параметров? Я ожидал, что не будет никаких других регистров, кроме .s32. Что за этим стоит? Существует ли ограниченное количество регистров каждого типа?