Во-первых, вы не можете сказать, что будет и не будет в регистрах исключительно на основе кода C. Это, конечно, не является источником разницы в производительности между двумя кодами. Фактически, оба ядра используют регистры для переменных float4, и код, с которым они компилируются, практически идентичен.
Первое ядро:
ld.param.u64 %rd3, [__cudaparm__Z7kernel0P6float4S0_S0__arg2];
add.u64 %rd4, %rd3, %rd2;
ld.global.v4.f32 {%f1,%f2,%f3,%f4}, [%rd4+0];
.loc 16 21 0
ld.param.u64 %rd5, [__cudaparm__Z7kernel0P6float4S0_S0__arg3];
add.u64 %rd6, %rd5, %rd2;
ld.global.v4.f32 {%f5,%f6,%f7,%f8}, [%rd6+0];
st.global.v4.f32 [%rd4+0], {%f1,%f2,%f3,%f4};
st.global.v4.f32 [%rd6+0], {%f5,%f6,%f7,%f8};
.loc 16 24 0
ld.param.u64 %rd7, [__cudaparm__Z7kernel0P6float4S0_S0__arg1];
add.u64 %rd8, %rd7, %rd2;
st.global.v4.f32 [%rd8+0], {%f1,%f2,%f3,%f4};
второе ядро:
ld.param.u64 %rd3, [__cudaparm__Z7kernel1P6float4S0_S0__arg2];
add.u64 %rd4, %rd3, %rd2;
ld.global.v4.f32 {%f1,%f2,%f3,%f4}, [%rd4+0];
ld.param.u64 %rd5, [__cudaparm__Z7kernel1P6float4S0_S0__arg1];
add.u64 %rd6, %rd5, %rd2;
st.global.v4.f32 [%rd6+0], {%f1,%f2,%f3,%f4};
Если между ними действительно существует разница в производительности, возможно, первое ядро имеет больше возможностей для параллелизма на уровне команд, чем второе. Но это только дикое предположение, не зная гораздо больше о том, как был проведен сравнительный анализ этих двух.