1

通常のdouble*を_m128d*にキャストするのは非常に簡単でわかりやすいです。次のような配列があるとします。

double arr[8] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};

すると、_m128dプレゼンテーションは次のようになります。

_m128d m_arr[8] = { [1.0,2.0] , [3.0,4.0] , [5.0,6.0] , [7.0,8.0] };

あなたがそれを言うことができるならば、常に2つの値が保存されるので(それは私がそれを想像する方法です)。しかし、代わりに3x3マトリックスを使用すると、値はどのように分割されますか?例えば:

double mat[3][3] = { {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0} };

マトリックス内のすべての値を合計しようとしていますが、SSEを使用してこれを効果的に行う方法がわからないため、マトリックスがどのように処理されるかを理解する必要があり_m128d**ます。誰か知っていますか?

4

1 に答える 1

2

重要なのは、多次元配列が1つの連続したメモリブロックに格納されることです(C標準はこれを保証します)。したがって、単純なポインタを使用してそれらを参照できます。

double mat[3][3] = { {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0}, {1.0, 2.0, 3.0} };
double *ptr = (double *)mat;

次に、このポインターを使用して9つの数値を反復処理し、それを逆参照してdoubleを取得します。これにより、別の型にキャスト/変換できます。

于 2013-01-21T19:26:11.460 に答える