У меня есть следующее ядро:
void version1(float *X, float *Y, int N) {
int n;
float x,y;
n = blockIdx.x * blockDim.x + threadIdx.x;
if (n >= N) return;
x=X[n];
x=x+1;
X[n]=x;
y=Y[n];
y=y+1;
Y[n]=y;
}
и вторая версия
void version2(float *X, float *Y, int N) {
int n;
float Xb47w;
n = blockIdx.x * blockDim.x + threadIdx.x;
if(n >= N) return;
Xb47w=X[n];
Xb47w=Xb47w+1;
X[n]=Xb47w;
Xb47w=Y[n];
Xb47w=Xb47w+1;
Y[n]=Xb47w;
}
Они дают тот же результат. Однако версию 1 проще читать, а версию 2 сложнее, потому что Xb47w используется как для X, так и для Y. Поэтому я бы предпочел версию 1, но в ней два регистра x y вместо 1 Xb47w для версии 2. У меня есть много ядер, где я сохраняю регистры таким образом, но есть более сложные для чтения и обслуживания.
x больше не используется после X[n]=x
, поэтому мне интересно, понимает ли это компилятор CUDA и делает ли версию 1 почти идентичной версии 2, тем самым сохраняя один регистр?