2
int main()
{
    const int STRIDE=2,SIZE=8192;
    int i=0;
    double u[SIZE][STRIDE]; 
    #pragma vector aligned
    for(i=0;i<SIZE;i++)
    {
        u[i][STRIDE-1]= i;
    }
    printf("%lf\n",u[7][STRIDE-1]);
    return 0;
}

コンパイラはここでxmmレジスタを使用します。ストライド2アクセスがあり、コンパイラにこれを無視させ、メモリの定期的なロードを実行してから、代替ビットをマスクして、SIMDレジスタの50%を使用するようにします。メモリに保存する前に、レジスタをビット単位でロードしてマスクするために使用できる組み込み関数が必要です。

PS:私はこれまでアセンブリコーディングを行ったことがありません

4

3 に答える 3

2

マスク値が0xAA(10101010)のマスクされたストア

于 2012-11-07T22:38:23.913 に答える
0

マスクされたロードを実行することはできません(マスクされたストアのみ)。最も簡単な代替方法は、ロードを実行してから自分でマスクすることです(たとえば、組み込み関数を使用します)。

潜在的に優れた代替手段は、配列を「double u[STRIDE][SIZE];」に変更することです。そのため、何もマスクする必要がなく、XMMレジスタの半分が無駄になる/マスクされることはありません。

于 2012-11-03T10:00:04.197 に答える
0

AVXがなければ、SIMDレジスタの半分はとにかく1つのdoubleにすぎないため、通常の64ビットストアにはほとんど問題がないようです。

マスクされたストア(MASKMOVDQU / MASKMOVQ)を使用する場合は、MOVNTPSのような非テンポラルストアと同じように、DRAMに直接書き込むことに注意してください。これはあなたが望むものかもしれないし、そうでないかもしれません。データがキャッシュに収まり、すぐに読み取る予定の場合は、データを使用しない方がよいでしょう。

特定のAMDプロセッサは、MOVNTSDを使用してXMMレジスタから64ビットの非一時ストアを実行できます。これにより、MASKMOVDQUと比較して少し単純化される可能性があります)。

于 2012-11-12T17:55:27.043 に答える