|
|
Log In | Not a Member? |
Contact ADC |
| < Previous PageNext Page > |
Listing B-2に、行列乗算を実行する、アーキテクチャに依存しないベクトルコードを示します。PowerPC (-faltivec)またはx86 (-msse)用に適切なコンパイラフラグを設定していない場合、またはPowerPCでAltiVecが利用できない場合、このコードはスカラーとしてコンパイルされます。MyMatrixMultply関数で使用する行列は、2次元配列について、FORTRAN式の格納順序ではなく、C言語式の格納順序を前提としています。
Listing B-2 行列乗算を実行するアーキテクチャに依存しないコード
void MyMatrixMultiply( vFloat A[4], vFloat B[4], vFloat C[4] ) |
{ |
vFloat A1 = vLoad( A ); // Aの行1 |
vFloat A2 = vLoad( A + 1 ); // Aの行2 |
vFloat A3 = vLoad( A + 2 ); // Aの行3 |
vFloat A4 = vLoad( A + 3); // Aの行4 |
vFloat C1 = vZero(); // Cの行1、ゼロに初期化 |
vFloat C2 = vZero(); // Cの行2、ゼロに初期化 |
vFloat C3 = vZero(); // Cの行3、ゼロに初期化 |
vFloat C4 = vZero(); // Cの行4、ゼロに初期化 |
vFloat B1 = vLoad( B ); // Bの行1 |
vFloat B2 = vLoad( B + 1); // Bの行2 |
vFloat B3 = vLoad( B + 2); // Bの行3 |
vFloat B4 = vLoad( B + 3); // Bの行4 |
// Bの第1行とAの第1列を乗算する(合計はしない) |
C1 = vMADD( vSplat( A1, 0 ), B1, C1 ); |
C2 = vMADD( vSplat( A2, 0 ), B1, C2 ); |
C3 = vMADD( vSplat( A3, 0 ), B1, C3 ); |
C4 = vMADD( vSplat( A4, 0 ), B1, C4 ); |
// Bの第2行とAの第2列を乗算し、 |
// 前の結果に加算する(合計はしない) |
C1 = vMADD( vSplat( A1, 1 ), B2, C1 ); |
C2 = vMADD( vSplat( A2, 1 ), B2, C2 ); |
C3 = vMADD( vSplat( A3, 1 ), B2, C3 ); |
C4 = vMADD( vSplat( A4, 1 ), B2, C4 ); |
// Bの第3行とAの第3列を乗算し、 |
// 前の結果に加算する(合計はしない) |
C1 = vMADD( vSplat( A1, 2 ), B3, C1 ); |
C2 = vMADD( vSplat( A2, 2 ), B3, C2 ); |
C3 = vMADD( vSplat( A3, 2 ), B3, C3 ); |
C4 = vMADD( vSplat( A4, 2 ), B3, C4 ); |
// Bの第4行とAの第4列を乗算し、 |
// 前の結果に加算する(合計はしない) |
C1 = vMADD( vSplat( A1, 3 ), B4, C1 ); |
C2 = vMADD( vSplat( A2, 3 ), B4, C2 ); |
C3 = vMADD( vSplat( A3, 3 ), B4, C3 ); |
C4 = vMADD( vSplat( A4, 3 ), B4, C4 ); |
// 結果を書き込み先に書き込む |
vStore( C1, C ); |
vStore( C2, C + 1 ); |
vStore( C3, C + 2 ); |
vStore( C4, C + 3 ); |
} |
| < Previous PageNext Page > |
Last updated: 2006-03-08
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |