8

8192x8192 の行列をメモリに読み込む必要があります。できるだけ早くやりたいです。
今、私はこの構造を持っています:

char inputFile[8192][8192*4]; // I know the numbers are at max 3 digits
int8_t matrix[8192][8192]; // Matrix to be populated

// Read entire file line by line using fgets
while (fgets (inputFile[lineNum++], MAXCOLS, fp));

//Populate the matrix in parallel, 
for (t = 0; t < NUM_THREADS; t++){
    pthread_create(&threads[t], NULL, ParallelRead, (void *)t);
}

functionParallelReadでは、各行を解析しatoi、行列を作成して入力します。スレッド t が行を解析するように、並列処理は行単位です。t, t+ 1 * NUM_THREADS..

2 スレッドの 2 コア システムでは、これには

Loading big file (fgets) : 5.79126
Preprocessing data (Parallel Read) : 4.44083

これをさらに最適化する方法はありますか?

4

4 に答える 4

30

このようにするのは悪い考えです。十分なコアがあり、ハードディスクが 1 つしかない場合、スレッドはより多くの CPU サイクルを取得できます。したがって、必然的に、スレッドはファイル データの読み取り速度を向上させることができません。

彼らは実際にそれをさらに悪化させます。ファイルからのデータの読み取りは、ファイルに順次アクセスする場合に最も高速です。これにより、ディスク ドライブで最もコストのかかる操作であるリーダー ヘッド シークの回数が最小限に抑えられます。読み取りを複数のスレッドに分割し、それぞれがファイルの異なる部分を読み取ることにより、リーダーの頭を常に前後にジャンプさせます。スループットが非常に悪い。

ファイル データの読み取りには1 つのスレッドのみを使用します。ファイル データのチャンクがロードされたら、スレッドを開始することで、ファイル データのいくつかの計算サイクルとオーバーラップできる場合があります。

テスト効果に注意してください。プログラムを再実行すると、通常はコードを少し調整した後に、プログラムがファイル システム キャッシュ内のファイル データを見つけて、ディスクから読み取る必要がなくなる可能性があります。これは非常に高速で、メモリ バスの速度が速く、メモリ間のコピーです。データセットはそれほど大きくなく、最新のマシンの RAM の量に簡単に収まるため、おそらくあなたのデータセットにあるでしょう。これは (通常) 運用マシンでは発生しません。そのため、キャッシュをクリアして、OS に関係なく現実的な数値を取得してください。

于 2012-05-20T20:49:19.107 に答える
2

fread のようなものを使用して文字配列をロードする親スレッドを試して、1 io のすべてを大きな大きな文字列としてロードします。

親にひもを歩いてもらい、1 本の線を見つけるか、サイズに基づいて最初の線がどこにあるかを計算します。その行の処理をスレッドに渡します。次の行、リンス、繰り返し、EOF まで。スレッドと同期します。終わり。

于 2012-05-20T20:30:18.453 に答える
2

考慮すべきことの 1 つは、2 つの小さな入力バッファーを割り当てることです (それぞれ 200 行になるとします)。

次に、1 つのスレッドにデータを入力バッファーに読み込ませます。1 つの入力バッファーがいっぱいになったら、解析を行う 2 番目のスレッドに渡します。この 2 番目のスレッドは、同時解析にスレッド プールを使用できます (openMP を確認してください)。

いずれかのスレッドが排他的にアクセスできるようにするには、ロック/ミューテックスを使用する必要があります。

解析がファイルの読み取りと同時に行われるようになり、バッファへのメモリ アクセスがよりローカルになり、CPU キャッシュに適合するため、これはより良い方法です。これにより、読み取りと解析の速度が向上します。

fgets がボトルネックの場合は、ファイルをバイナリとしてメモリに読み込むこともできます。これにより読み取り速度が向上する可能性がありますが、追加の解析が必要になり、上記の最適化の実行が難しくなります。

于 2012-05-20T19:58:54.780 に答える
2

ファイル I/O で得られる最高のパフォーマンスは、メモリ マッピングによるものです。これは一例です。シングル スレッド設計から始めて、ロード後の処理がボトルネックであることが判明した場合は、それを並列化します。

于 2012-05-20T20:33:15.060 に答える