0

リソースをほとんど使用せず、非常に高速なアプリケーションを開発しています。私のアプリでunsigned char* rawDataは、画像から取得したバイトを含む を使用しています。したがって、このrawData配列では、一部のバイトを保持し、他のバイトをゼロに設定する必要があります。しかし、ループを使用することは許可されていません (それ以外の場合は、各バイトを実行してゼロに設定できます)。

そこで質問です。

Q1) C のようZeroMemoryにObjective C にメソッドはありますか?

Q2) ループを使用せずに必要なバイトをゼロに設定する他の方法はありますか?

前もって感謝します...

PS必要に応じてコードを提供できます...

4

1 に答える 1

2

バッファのサイズがわからない場合は、ループなしでは実行できません。自分でループを作成しなくても、strlenのようなものを呼び出すとループが発生します。ここでも再帰をループとして数えています。

どのバイトを保持し、どのバイトをゼロに設定するかをどのようにして知ることができますか?これらのバイトが既知の位置にある場合は、ベクトル演算を使用して、一部のバイトをゼロにし、他のバイトをゼロにすることはできません。次の例では、次の最初の64バイトの偶数バイトのみをゼロにしますrawData

__m128i zeros = _mm_setzero_si128();
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0};
__m128i sse_mask = _mm_load_si128(mask);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]);

の各バイトの上位ビットmaskが1の場合、の対応する値zerosがにコピーされrawDataます。これらのマスクされたコピーのシーケンスを使用して、一部のバイトをすばやく置き換え、他のバイトを置き換えることはできません。結果のマシンコードはSSE操作を使用するため、これは実際には非常に高速です。rawData必須ではありませんが、 16バイトにアラインされている場合、SSE操作ははるかに高速に実行されます。

ARMをターゲットにしている場合は申し訳ありません。NEON組み込み関数は似ていますが、同一ではないと思います。

于 2012-04-27T13:44:17.940 に答える