多くの場合、内部ループでは、「ラップアラウンド」方式で配列にインデックスを付ける必要があります。たとえば、配列サイズが100で、コードが要素-2を要求する場合、要素98を指定する必要があります。 Pythonなどの高級言語では、これを簡単に行うことができますmy_array[index % array_size]
が、何らかの理由で、Cの整数演算は(通常)一貫して切り捨てるのではなくゼロに向かって丸められます。その結果、そのモジュロ演算子は、負の最初の引数が与えられると負の結果を返します。
index
多くの場合、それは以上になることを知っていますが-array_size
、これらの場合は単にそうしますmy_array[(index + array_size) % array_size]
。ただし、これが保証されない場合もあります。そのような場合は、常に正のモジュロ関数を実装するための最速の方法を知りたいと思います。分岐せずにそれを行うためのいくつかの「賢い」方法があります。
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n;
}
また
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0));
}
もちろん、これらのプロファイルを作成して、システムで最速のものを見つけることはできますが、より良いものを見逃した可能性があることや、別のマシンで高速なものが遅い可能性があることを心配せずにはいられません。
それで、これを行うための標準的な方法、または私が見逃したいくつかの巧妙なトリックがありますか?それは可能な限り最速の方法である可能性がありますか?
また、それはおそらく希望的観測だと思いますが、自動ベクトル化できるこれを行う方法があれば、それは驚くべきことです。