開始位置と終了位置を示す2つの符号なしショートのコンパクトな構造体を使用しています。しきい値を超える長さ(開始から終了までの差)を持つオブジェクト
があるかどうかをすばやく判断できる必要があります。Range
それぞれが独自の配列を持つ膨大な量のオブジェクトを作成するため、リストなどでしきい値を超えているオブジェクトRange
を追跡することはできません。Range
このコードも非常に頻繁に実行されるため(配列ごとに1秒間に何回も)、効率的である必要があります。
struct Range
{
unsigned short start;
unsigned short end;
}
私は常にRange
サイズ2^nの配列を持っています。しきい値を超えるものが見つかったらすぐに中止したいのですが、ループをベクトル化できると仮定すると、単純にORをとって、最後にチェックする方が速いと確信しています。各ベクトルの結果のチャンクに対してifステートメントを実行できれば、それは素晴らしいことです。
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;
}
当然のことながら、私のデータ型は32ビットまたは64ビット幅ではないため、自動ベクトル化機能によって1202エラーが発生します。データサイズを2倍にして、各フィールドをunsignedintにしたくありません。だから私は自動ベクトル化のアプローチがこれのために出ていると思います。
16ビット変数を処理できるベクトル命令はありますか?ある場合、ループをベクトル化するためにC ++でそれらをどのように使用できますか?