评估for循环的算术强度

时间:2015-05-18 08:24:41

标签: c++ cuda parallel-processing

我在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;
}

我想评估它的算术强度。 mlp在循环之外定义。

我计算了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个浮点运算(将floorsqrt统计为每个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计数,以及标量值mlp是否应计入数据移动计数(或者它们是否保存在寄存器中,因此不计算在内,请参阅AXPY example on p. 16 here

0 个答案:

没有答案