我在CUDA GPU上并行执行以下循环:
// define m, lp, N
for(int i=0; i<N; ++i){
float p, s;
int q;
s = m + sqrt( ARR1[ ARR2[i] ] )*ARR3[i];
if ( ARR4[2*i] <= ARR10[i] ){
if ( s > 0){
p = lp*s;
q = floor( ARR4[2*i+1]*ARR5[i]/p );
} else{
p = -lp/s;
q = -floor( ARR4[2*i+1]*ARR6[i] );
}
} else{
if ( s > 0){
p = lp/s;
q = -floor( ARR4[2*i+1]*ARR6[i] );
} else{
p = -lp*s;
q = floor( ARR4[2*i+1]*ARR5[i]/p );
}
}
if ( q != 0){
ARR7[i] = p;
ARR8[i] = q;
} else{
ARR7[i] = 0;
ARR8[i] = 0;
}
ARR9[i] = i;
}
我想评估它的算术强度。 m
和lp
在循环之外定义。
我计算了11个内存操作:ARR2[i]
,ARR1[ARR2[i]]
,ARR3[i]
,ARR4[2*i]
,ARR4[2*i+1]
,ARR5[i]
,ARR6[i]
,ARR7[i]
,ARR8[i]
,ARR9[i]
,ARR10[i]
,
...和9个浮点运算(将floor
和sqrt
统计为每个FLOP):m + sqrt( ARR1[ ARR2[i] ] )*ARR3[i]
(3),p = lp*s
或变体(1) ,q = floor( ARR4[2*i+1]*ARR5[i]/p )
或变体(5,包括2用于指数计算)。
由于所有数组元素都是4位长,因此我的算术强度为 9/(4*11) = 0.2045
。它是否正确?我正确计算内存和算术运算吗?特别是,我不确定索引数组计算2*i+1
是否应计入FLOP计数,以及标量值m
和lp
是否应计入数据移动计数(或者它们是否保存在寄存器中,因此不计算在内,请参阅AXPY example on p. 16 here。