私は、可能な絶対最大速度で、ベクトルの合計を散在するメモリ位置にストリーミングするプログラムを作成する任務を負っています。入力データは目的地 ID と XYZ float ベクトルなので、次のようになります。
[198, {0.4,0,1}], [775, {0.25,0.8,0}], [12, {0.5,0.5,0.02}]
そして、次のようにそれらをメモリに合計する必要があります。
memory[198] += {0.4,0,1}
memory[775] += {0.25,0.8,0}
memory[12] += {0.5,0.5,0.02}
問題を複雑にするために、複数のスレッドが同時にこれを実行し、異なる入力ストリームから読み取りますが、同じメモリに合計します。同じメモリ ロケーションに対して多くの競合が発生するとは考えていませんが、競合が発生する可能性はあります。データ セットは非常に大きくなります。可能な限り最高の読み取り帯域幅を得るために、複数の SSD から同時にストリーミングする 10 GB 以上の複数のストリームです。数学的には SSE を想定していますが、必ずしもそうである必要はありません。
結果はしばらく使わないのでキャッシュを汚す必要はないのですが… ただ書くだけでなくメモリに集計しているのでMOVNTPSとか使えないですよね?しかし、スレッドはお互いにそれほど踏み込むことはないので、多くのロック オーバーヘッドなしでこれを行うにはどうすればよいでしょうか? メモリフェンシングでこれを行いますか?
助けてくれてありがとう。それが違いを生むなら、私はNehalem以上を想定できます。