5

strlen関数をコーディングして\0シーケンスを並列で検索することにメリットがあるかどうか疑問に思っています。もしそうなら、そのような関数は何を考慮に入れるべきですか? ありがとう。

4

6 に答える 6

8

strlen()精神によって連続しています-ヌルターミネーターを超える1ステップは未定義の動作であり、ヌルターミネーターはどこにでもある可能性があります-最初の文字または100万番目の文字なので、順番にスキャンする必要があります.

于 2011-02-25T15:52:26.437 に答える
4

NULスレッドによって見つかった が文字列の最初にあることを確認する必要があります。NULつまり、スレッドは最も低いNUL位置で同期する必要があります。したがって、それは可能ですが、同期のオーバーヘッドは、並列化による潜在的な利益よりもはるかに高くなります。

また、キャッシングの問題もあります。1 つのスレッドで文字列を連続して読み取ることができるため、キャッシュに適しています。複数のスレッドは、互いのつま先を踏むリスクがあります。

于 2011-02-25T15:56:52.630 に答える
1

一部の並列アーキテクチャでは可能ですが、文字列を超えたかなりの量のメモリに安全にアクセスできることを保証できる場合に限ります。文字列が非常に長く、スレッド通信と同期が安価であると予想される場合にのみ、実用的です。たとえば、16 個のプロセッサがあり、文字列の末尾を越えて 256KB に安全にアクセスできることがわかっている場合、16 個のプロセッサをディスパッチして 16 個の 4K チャンクを処理することから始めることができます。プロセッサが終了してゼロが見つからないたびに、次の 4K チャンク (まだ進行中の最も低いチャンクの 256KB 以内にある場合) の処理を​​開始するか、または最も低いプロセッサが完了するのを待つことができます。実際には、文字列が非常に巨大でない限り、同期の遅延と過剰な作業により、並列処理によるメリットは意味がありません。

于 2011-04-27T15:25:45.480 に答える
0

それはアーキテクチャに依存します。複数の計算ユニットで最初の null 文字を探しても問題はありませんが、メモリから安定したデータ ストリームを供給し続ける必要があります。キャッシュ境界を念頭に置いて、正確なパラメーターに対してプラットフォーム固有のチューニングを実行することをお勧めします。

于 2012-11-15T21:12:52.617 に答える
0

これは FIXED-WIDTH 文字列で使用できますが、それ以上のことはできません。

于 2012-07-11T22:46:15.243 に答える
0

タスクを並列化するには、入力データを分割して複数のスレッドにディスパッチする必要があります。文字列の長さが事前にわからないと、データを分割することはできません。

そのため、事前に入力データの割り当てサイズ (文字列の長さと必ずしも同じではない) を知っておく必要があります。

プログラムは、見つかった可能性のある複数の NUL 値を返す場合があります。関数は、見つかった NUL 値の前に来るデータを処理しているすべてのスレッドが完了した場合にのみ、正しい NUL 値が見つかったことを知ることができます。

文字列が 8 つのチャンク (0-7) に分割されているとします。チャンク 3 に NUL 値が見つかった場合、チャンク 0 ~ 2 に他の NUL 値があるかどうかがわからないため、これらのスレッドのいずれかを待機する必要があり、他のすべてのスレッドをすぐに停止できます。スレッド 1 で NUL 値が見つかった場合は、スレッド 0 が完了するのを待つだけでよいため、決定的な答えを得ることができます。

于 2011-02-25T17:18:13.343 に答える