1

通常、BLAS サブルーチンは、特定の固有の操作に対して定義されます。例えば、

DAXPY必然的にy <-- ax + y

DSCALは必ずx = ax

私が達成したいことは次のとおりです。

z = ax+byy = ax

BLAS のサブルーチンを「拡張」して、上記のことができるようにするにはどうすればよいですか? (これらの操作は必ずしも相互に続くわけではありません)

私が試してみました:

  • ダミーを宣言してDCOPYから、ダミーを目的のベクトルに ing します。お気に入り、DCOPY(dummy,x); DSCAL(a,dummy),DCOPY(y,dummy)

  • 独自の OpenMP 実装の作成

  • DCOPY(y,a*x)y=axの場合、次のようなトリックを使用します

しかし問題は、これらの方法のどれもが、この問題を回避する最善の方法であるという決定的な答えを私に与えてくれないようだということです. 質問するよりも「プロファイル、プロファイル、プロファイル」の方がよいことはわかっていますが、すべて試してみましたが、ベクターを少し変更するたびに、以前の最良の方法が突然最悪の方法になったり、その逆になったりします。

また、

  • 私の意図は、可能な限り最高のパフォーマンスをもたらすことです。
  • これらの操作を最適化しても、おそらくパフォーマンスが大幅に向上しないことはわかっていますが、できる限りピコ秒ごとに節約しようとしています。
  • FWIW、インテル MKL にリンクしています
4

3 に答える 3

2

まず、y <-axの説明では、DCOPY(y、x);を使用して1つの余分なコピーを削除できます。DSCAL(a、y)。

第二に、OpenMP IMHOは、「メモリにバインドされている」ため、この種の問題の解決策ではありません。ペナルティは、計算とベクトル化によるメモリアクセスのパイプライン化にあり、ベクトルメモリアクセスを使用することでより多くの帯域幅を使用します。(分岐予測、キャッシュポリシー、レジスタファイル構成など)ため、手動で調整されたコードは非常に複雑になるはずです。特定のプラットフォーム用に最適化された操作実装を自動的に生成するR.ClintWhaleyのAtlasライブラリのようなものが必要です。AFAIK、BLAST標準(2001)があります、多分あなたはあなたが提示した操作の同様の変形を見つけるでしょう。これらの操作をオートチューナーに追加するには、電子メールを送信する必要があるかもしれません。

出発点として、次のz = ax+byの実装を使用することをお勧めします。この場合、xとyが読み取り専用であれば、zはとにかく書き込まれます。次を使用できます。DCOPY(z、y); DSCAL(b、z); DAXPY(a、x、z);

また、ATLASプロジェクトに関する記事を読むこともできます。この記事には、コード最適化の重要な側面(madd操作の存在、キャッシュの特性、レジスタファイルの構成、命令のレイテンシーなど)に関する主な考慮事項が含まれており、コードジェネレーターのようなものを書いてみてください。さまざまな操作のパイプライン実行への操作と、さまざまなバリアント間の検索を実行します。

これは興味深いトピックです。私は、Cellプロセッサのように、明示的に管理されたメモリ階層を備えた異種マルチコアアーキテクチャにBLASを実装してきました。幸運を祈ります!私の答えがお役に立てば幸いです。

于 2012-04-14T20:20:26.030 に答える
0

MKL を使用しているため、拡張子 DAXPBY を使用できますy <-- ax + by。操作は次のようになります。

`z = ax + by`: DCOPY(n,z,1,y,1), then DAXPBY(n,a,x,1,b,z,1)
`y = ax`: DAXPBY(n,a,x,1,0,y,1)

また、単純なスカラー コードをコンパイラーにベクトル化させてみることもできます。理論的には、これらの単純な操作は自動ベクトル化に適しているはずです (もちろん、実際には...)

于 2012-04-24T01:47:58.033 に答える
0

Fortran 95 配列表記を使用して独自のルーチンを作成し、コンパイラが適切なコードを生成できるかどうかを確認することをお勧めします。帯域幅が制限された操作は単純な実装によってほぼ限界に達しているため、データが既にキャッシュに常駐していない限り、専門家によって書かれた最適化された BLAS1 ライブラリ実装は、おそらく最適化されていない Netlib BLAS1 よりもはるかに高速ではないため、そうなると思います (その場合、ベクトル化によって何らかの効果が得られます)。

過去にこのような比較を行ったところ、キャッシュに存在しないベクトルについては、最適化された BLAS1 スタイル ルーチンと最適化されていない BLAS1 スタイル ルーチンの違いはごくわずかであることがわかりました。

于 2015-01-05T06:12:41.387 に答える