0

OpenMP スレッドを使用する C++ コードに取り組んでいます。OpenMP スレッドの数と理論上の曲線 (コードを完全に並列化できた場合) に対する高速化曲線をプロットしました。

ここにこのプロットがあります:

ここに画像の説明を入力

この図から、このコードは (並列化の観点から) スケーラブルではないと言えますか? つまり、コードは 2 つの OpenMP スレッドで 2 倍高速ではなく、4 スレッドで 4 高速ではありません。

ありがとう

4

1 に答える 1

2

16 スレッドで 2.5 倍のスピードアップをかろうじて達成するコードの場合、スケーリングしないと言っても過言ではありません。ただし、「スケーラブルではありません」は、より強力なステートメントと見なされることがよくあります。私が理解している違いは、「スケールしない」は通常、特定の実装を指し、固有のスケール不能を意味するものではないということです。つまり、ボトルネックが解消されれば、拡張できる可能性があります。一方、「スケーラブルではない」とは、通常、「少なくともコア アルゴリズムを変更しない限り、スケーリングできない」ことを意味します。そういう意味で、チャートを見ただけでは「問題・コード・アルゴリズムがスケーラブルではない」とは言えません。

さらに、完全なスケーリング (2 スレッドで 2 倍、4 スレッドで 4 倍など) を期待するのは必ずしも合理的ではありません。理想的なスケーリングに「十分に近い」曲線は、優れたスケーラビリティを示していると見なされる場合があります。そして、「十分に近い」とは何を意味するかは、多くの要因に依存する可能性があります。スケーラビリティが問題になる場合は、スピードアップではなく、並列効率を伝えたり考えたりすることが役立ちます。たとえば、並列効率が 0.8 (または 80%) で、スレッド数が増えても低下しない場合、スケーラビリティは良好と見なすことができます。また、一部のプログラムは、特定の数のスレッドまでは適切にスケーリングされる可能性がありますが、さらにリソースが追加されると、フラットのままになるか、ダウンすることさえあります。

于 2014-10-22T20:05:50.537 に答える