私は開始位置と終了位置を示す2つの符号なしショートのコンパクトな構造体を使用しています。
長さ(開始から終了までの差)がしきい値を超えているRange
オブジェクトがあるかどうかを素早く判断できる必要があります。ショートを含む条件付きのベクトル化
私はそれぞれ独自のRange
配列を持つ膨大な数のオブジェクトを持っていますので、どのオブジェクトがしきい値を上回っているかをリストで確認することはできません。また、このコードは非常に頻繁に実行されるため(効率的である必要があるため、各アレイの1秒間に何度も実行されます)
struct Range
{
unsigned short start;
unsigned short end;
}
私はいつもRange
のサイズが2^nの配列を持ちます。スレッショルドを超えるとすぐに中止したいと思っていますが、ループ全体を単純化するか、最後にチェックする方が速いでしょう。それぞれのベクトルの結果の塊についてif文を書くことができれば、それは壮大なものになります。私のデータ型がない32または64ビット幅であるため、
size_t rangecount = 1 << resolution;
Range* ranges = new Range[rangecount];
...
bool result = false;
for (size_t i = 0; i < ranges; ++i)
{
result |= (range[i].end - range[i].start) > 4;
}
は驚くことではないが、自動ベクトライザーは、1202エラーが発生します。私は本当にデータサイズを倍にして各フィールドを符号なしintにしたくありません。だから、私はオートベクトル化のアプローチがこれに当てはまると推測しています。
16ビット変数を処理できるベクタ命令はありますか?もしあれば、どうすればループをベクトル化するためにC++でそれらを使うことができますか?
必要がありますか?このルックアップを高速化する別のデータ構造に格納してみてはどうでしょうか? – loganfsmyth
_ Rangeオブジェクトがリストのなかのスレッショルドを上回っているかどうかを追跡することは不可能です。あなたがしたいのは、ルールを破る範囲があるかどうかを判断し、それを追跡するだけです。あなたはそれを行うためにすべてのオブジェクトを追跡する必要はありません。 –
どのくらいの頻度で 'end'を使いますか? '(start、end)'の代わりに '(start、size)'表現に切り替えることは可能でしょうか。もちろん、使用するたびに 'end'を計算する必要がありますが、' end'と 'size'の相対的な使用率が低い場合、それはまだ勝利に終わる可能性があります。 – twalberg