Почему CUDA получает и возвращает параметры int через регистры .b32 или .u32 - PullRequest
0 голосов
/ 05 июля 2018

Очень простая функция 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. Что за этим стоит? Существует ли ограниченное количество регистров каждого типа?

...