チューダーがとても親切に指摘してくれたので、あなたは悪い例を選びました。回転するディスクハードウェアは、プラッターとヘッドを移動するという物理的な制約を受けます。最も効率的な読み取りの実装は、各ブロックを順番に読み取ることです。これにより、ヘッドを移動したり、ディスクが整列するのを待つ必要がなくなります。
とは言うものの、一部のオペレーティングシステムは常にディスクに物事を継続的に保存するとは限りません。覚えている人にとっては、OS /ファイルシステムがその役割を果たさなかった場合、デフラグによってディスクのパフォーマンスが向上する可能性があります。
メリットのあるプログラムが必要だとおっしゃっていましたが、単純な行列の加法を提案させてください。
コアごとに1つのスレッドを作成したとすると、追加する任意の2つのマトリックスをN(スレッドごとに1つ)の行に簡単に分割できます。行列の加法(思い出す場合)は次のように機能します。
A + B = C
また
[ a11, a12, a13 ] [ b11, b12, b13] = [ (a11+b11), (a12+b12), (a13+c13) ]
[ a21, a22, a23 ] + [ b21, b22, b23] = [ (a21+b21), (a22+b22), (a23+c23) ]
[ a31, a32, a33 ] [ b31, b32, b33] = [ (a31+b31), (a32+b32), (a33+c33) ]
したがって、これをN個のスレッドに分散するには、行数とモジュラスをスレッド数で割って、追加される「スレッドID」を取得する必要があります。
matrix with 20 rows across 3 threads
row % 3 == 0 (for rows 0, 3, 6, 9, 12, 15, and 18)
row % 3 == 1 (for rows 1, 4, 7, 10, 13, 16, and 19)
row % 3 == 2 (for rows 2, 5, 8, 11, 14, and 17)
// row 20 doesn't exist, because we number rows from 0
これで、各スレッドは処理する行を「認識」し、結果が他のスレッドの計算ドメインと交差しないため、「行ごと」の結果を簡単に計算できます。
ここで必要なのは、値がいつ計算されたかを追跡する「結果」データ構造であり、最後の値が設定されると、計算が完了します。2つのスレッドを使用した行列の加算結果のこの「偽の」例では、2つのスレッドを使用して回答を計算するのに約半分の時間がかかります。
// the following assumes that threads don't get rescheduled to different cores for
// illustrative purposes only. Real Threads are scheduled across cores due to
// availability and attempts to prevent unnecessary core migration of a running thread.
[ done, done, done ] // filled in at about the same time as row 2 (runs on core 3)
[ done, done, done ] // filled in at about the same time as row 1 (runs on core 1)
[ done, done, .... ] // filled in at about the same time as row 4 (runs on core 3)
[ done, ...., .... ] // filled in at about the same time as row 3 (runs on core 1)
より複雑な問題はマルチスレッドによって解決でき、さまざまな問題はさまざまな手法で解決されます。最も単純な例の1つを意図的に選びました。