原則
そのような単純な計算は、精巧に並列化する価値がないことはわかっています。これはそのような例であり、数学演算は、より興味深い計算の単なるプレースホルダーです。
【疑似コード】
var id = 0,
do {
id = getGlobalId();
output[id] = input[id] * input[id];
} while (inRange(id) && output[id] !== 25);
最も特殊な表現は次のとおりoutput[id] !== 25
です。つまり、次のことを意味します: input
4 つの要素 (この順序で) がある場合:[8, 5, 2, 9]
でoutput
ある必要があり、 or[64, 25]
の 2 乗は のアイテムとして使用されません(はandのためであるため)。2
9
output
output[id] !== 25
true
id = 1
input[id] = 5
このコードを最適化する場合、input[id]
事前に (2 番目の条件を証明せずにwhile
) の 2 乗を計算することをお勧めしますが、結果が後で関連するという保証はありません (前の計算の結果が 25 だった場合)。 、現在の計算の結果は興味深いものではありません)。
一般化して、私は計算結果 output[id]
( output[id] = calculateFrom(input[id]);
) がすべてに関連していないid
可能性があるケースについて話しています。結果 ( ) の必要性は、output[id]
別の計算の結果に依存します。
私の目標
OpenCLカーネルとキューを使用して、このループを可能な限り並列かつ高性能に実行したいと考えています。
私のアイデア
私は考えました:そのような
do...while
ループを並列化できるようにするには、事前にいくつかの計算(output[id] = calculateFrom(input[id]);
)を同時に行う必要があります(結果output[id]
が役立つかどうかはわかりません)。そして、前の結果が だった場合、結果は25
単純output[id]
に拒否されます。の確率を考えたほうがいいかもしれません
output[id] !== 25
。確率が非常に高い場合、結果が拒否される可能性があるため、事前に多くの計算を行うことはありません。確率が絶対に低い場合は、事前により多くの計算を行う必要があります。処理ユニットの現在のステータスをリッスンする必要があります。すでに過緊張している場合は、重要でない事前計算を行うべきではありません。しかし、事前計算を処理するのに十分なリソースがある場合は、そうではありません。- 理由: 事前計算と以前の計算 (これらの事前計算が依存している) が同時に処理される場合、事前計算の追加によって以前の計算が遅くなる可能性もあります - (私の2番目の質問を参照してください)
私の質問
- そのようなプログラムを並列化することは賢明ですか、それとも高性能ですか?
- プロセッシング ユニットに事前計算処理を行うのに十分なリソースがあるかどうかは、どの基準に基づいて判断すればよいですか? または:プロセッシング ユニットに負荷がかかりすぎているかどうかを確認するにはどうすればよいですか?
do...while
そのようなsを並列化するための他の計画について知っていますか? それについて何か考えはありますか?
私があなたに伝えたいことが常に明確であることを願っています。そうでない場合は、私の質問にコメントしてください。- ご回答とご協力ありがとうございます。