2012-01-05 7 views
0

私は多くのノルム、ドットプロダクト、そして最も重要なのはマトリックスベクトル乗算を実行する必要があるアプリケーションを持っています。BLAS 2用Fortran vs

マトリックスおよびベクトルは、巨大です。

while(condition) 
/* usually iterations=dimension of matrix, so around 1 million iterations are *at least* required (if not more) */ 
matrix-vector multiplication 
3 dot prods 
2 norms 

私は現在、インテルMKLとインテル®Fortranを使用しています:行列の次元は、ループ構造がある100000x100000

なる傾向にあります。インテル®MKLのインテル®Cでコードを書き直すのに役立ちますか? 誰かが(特にDGEMVの)あらゆる種類のベンチマークを実行しましたか? コードの書き換えは大きな痛みですが、理由がわかったら書き直しても大丈夫です。

編集:私は間違っています:マトリックスの寸法は百万ではなく100000です。かなり重大なエラー:|

はい、行列は、密度が高く、密度が高い必要があります。です。 さらに、それは対称ではなく、正定でさえありません。 私のアルゴリズムはQMRの修正版です。

+2

4000Gbの高密度マトリクスで作業していますか?もっと教えてください.... – talonmies

+3

1Mx1Mの倍数の行列には8 TB(8,000 GB)のメモリが必要です。あなたは本当に密な行列が本当に必要であると確信していますか?あなたのアルゴリズムは、行列ベクトル積を必要とする典型的な反復線形代数アルゴリズムのように聞こえます。私はあなたのマトリックスが疎な構造を持っていると確信しています。そのため、標準的なBLASルーチンの一部ではない特別なデータ構造が存在します。これは、言語を切り替えることによって得られる小さなスピードアップ(もしあれば)を与えるのではなく、O(n^3)からO(n^2)までコードを高速化するため、最適化を探す最初のポイントになります。 –

+0

Intel Cとは何ですか? ISO C99またはその他の標準言語を使用する必要があります。インテルの従業員として書いていますので、私は確かに反インテルではありません:-) – Jeff

答えて

9

パフォーマンスは、CやFortranで完全に同じになります。これは、ライブラリ呼び出しをバッキングする実際の実装が同じであり、本質的にすべての時間がこれらのライブラリ呼び出しに費やされるためです。

+0

まず、私が完全にはっきりしていなければ、これはスーパーコンピューティング上の問題であり、私はコードを説明しています。 OpenMPのcreate/destroy関数とMatrix Vectorでは、BLAS 1/2が単純に並列化可能ではないため、多くの時間が無駄になります。障壁や同期の問題はありません。 Cが私に固有のショートカット(もしあれば)を提供できるなら、私は書き直したいかもしれません。 –

+9

その後、プロファイリング情報を提供し、それに関する提案を求める必要があります。元の質問は無意味です。 C言語のライブラリルーチンをFORTRANから同じライブラリルーチンを呼び出すよりも高速にするにはどうすればいいでしょうか?特に、ルーチンはおそらく(少なくともある時点では)主にFORTRANで書かれていたでしょうか? Cはどのようにして "ショートカットを提供"するのでしょうか? –