6

私は自分の質問に対する答えを見つけたと思います。NEON/VFP レジスタでスカラー計算を行うトリックを実行できる VFP 用の「fmacs」命令があります。


私はNEONまたはARMプログラミングに非常に慣れていません...

上三角行列を NEON レジスタにロードし、単精度を使用してベクトルの外積を積分 (累積) したいと考えています。基本的な考え方は、A += x'*x です。ここで、A は上三角行列です。一部の操作は、quad または double レジスターで NEON 命令 "vmla.f32" を使用して操作をベクトル化することで実行できます。ただし、一度に 1 つの精度レジスタを操作するだけでよい場合もあります。つまり、2 つまたは 4 つの単精度レジスタを操作する必要はありません。以下の例では(動作しません)、次の行に興味があります

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"

NEON レジスタを使用して 1 つの単精度演算を実行したいと考えています。

コードスニペット:

    __asm__ volatile (
    //load x into registers
    "vldmia    %0, {d0-d3}\n\t"
    // load A into registers
    "vldmia    %1, {d4-d12}\n\t"
    "vldmia    %1, {d13-d21}\n\t"
    // A[0-7] += x[0]*x[0-7]
    "vmla.f32  q2, q2, d0[0]\n\t"
    "vmla.f32  q3, q3, d0[0]\n\t"
    // A[8-14] += A[1]*x[1-7]
    "mla  s16, s16, d0[1]\n\t"
    // output
    :
    // input
    : "r"(A), "r"(x)
    // registers
    : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
    );
4

1 に答える 1

1

ベクトルにスカラーを掛けることについて質問していると思いますか?

「vdup」を使用してスカラーを NEON レジスタのすべてのレーンにロードしてから乗算します。

あなたがやろうとしていることのプレーンなCバージョンを投稿できれば、私はもっと助けようとすることができます...

于 2011-06-13T00:59:02.280 に答える