1

メモリの 2 つのブロックの速度をテストしたいと思い、64 ビット マシン (4M キャッシュ) で実験を行い、メモリの 2 つの領域をそれぞれ 32 ビット アラインと 64 ビット アラインで XOR しました。ビット整列領域 XOR は、32 ビット整列領域 XOR よりもはるかに高速ですが、2 つのタイプの XOR の速度はまったく同じです。

コード:

void region_xor_w32(   unsigned char *r1,         /* Region 1 */
                       unsigned char *r2,         /* Region 2 */
                       unsigned char *r3,         /* Sum region */
                       int nbytes)       /* Number of bytes in region */
{
    uint32_t *l1;
    uint32_t *l2;
    uint32_t *l3;
    uint32_t *ltop;
    unsigned char *ctop;

    ctop = r1 + nbytes;
    ltop = (uint32_t *) ctop;
    l1 = (uint32_t *) r1;
    l2 = (uint32_t *) r2;
    l3 = (uint32_t *) r3;

    while (l1 < ltop) {
        *l3 = ((*l1)  ^ (*l2));
        l1++;
        l2++;
        l3++;
    }
}

void region_xor_w64(   unsigned char *r1,         /* Region 1 */
                       unsigned char *r2,         /* Region 2 */
                       unsigned char *r3,         /* Sum region */
                       int nbytes)       /* Number of bytes in region */
{
    uint64_t *l1;
    uint64_t *l2;
    uint64_t *l3;
    uint64_t *ltop;
    unsigned char *ctop;

    ctop = r1 + nbytes;
    ltop = (uint64_t *) ctop;
    l1 = (uint64_t *) r1;
    l2 = (uint64_t *) r2;
    l3 = (uint64_t *) r3;

    while (l1 < ltop) {
        *l3 = ((*l1)  ^ (*l2));
        l1++;
        l2++;
        l3++;
    }
}

結果: 速度比較

4

1 に答える 1

2

これはデータ不足によるものだと思います。つまり、CPU が非常に高速で、コードが非常に効率的であるため、メモリ サブシステムが追いつかないということです。32 ビットでアラインされた方法での XOR でさえ、メモリからデータをフェッチするよりも時間がかかりません。そのため、32 ビットと 64 ビットの両方にアラインされたアプローチが同じ速度 (メモリ サブシステムの速度) になります。

実証するために、私はあなたの実験を再現しましたが、今回は XOR の 4 つの異なる方法を使用します。

  1. アライメントされていない (つまり、バイトアライメントされた) XORing;
  2. 32 ビットでアラインされた XORing;
  3. 64 ビットでアラインされた XORing。
  4. 128 ビットでアラインされた XORing。

最後のものは、SSE2 命令セットの一部である _mm_xor_si128()を介して実装されました。XORing のさまざまな方法の速度 (最適化されたバイナリ)

ご覧のとおり、128 ビット処理に切り替えてもパフォーマンスは向上しませんでした。一方、バイトごとの処理に切り替えると、すべてが遅くなりました。これは、この場合、メモリ サブシステムがまだ CPU に勝っているためです。

于 2013-03-28T16:18:40.780 に答える