私の内側のループでは、配列のサイズを100にしてコードが要素-2を要求するように、「ラップアラウンド」の方法で配列をインデックスする必要があります。 Pythonのような多くの高水準言語では、my_array[index % array_size]
で単純にこれを行うことができますが、何らかの理由でCの整数演算(通常)が常に丸められるのではなくゼロに向かって丸められ、結果的にモジュロ演算子が返します負の第1引数が与えられた場合は負の結果になります。C/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))
}
として分岐せずにそれを行うには、いくつかの「賢い」方法がありますが、私は私のシステム上で最速であるかを調べるためにこれらのプロファイルを作成することができますが、私はすることができます私がより良いものを見逃しているかもしれないことを心配するのを助けるか、または私のマシンで速いものが別のマシンでは遅くなるかもしれないことを助けてください。
これを行うための標準的な方法がありますか、または私が逃した巧妙なトリックは、可能な限り速い可能性がありますか?
また、これはおそらく希望の考えですが、自動ベクタライズできるこれを行う方法があれば、それは素晴らしいことでしょう。
一貫して同じ数にモデリングしていますか? – Mysticial
@Mysticialは通常、はいです。 – Nathaniel
@Mysticialでも解決策が私が2の累乗になるようモデリングする数を制限するなら、それは問題ありません。 – Nathaniel