Hatena::ブログ(Diary)

kazuhoのメモ置き場

2008-06-16

InnoDB の数値がクライアントに送信されるまで

  1. InnoDB から MySQL コアへ4バイトコピー
  2. 数値としてロード (RISC 系のみ)
  3. 数値をテンポラリバッファへ文字列化 (除算は桁毎に1回)
  4. 文字列の先頭を揃えて memcpy
  5. 数値の文字列を行バッファへ追記
  6. バッファを転送データバッファへ追記
  7. 送信

うーん...

追記: バックエンド直接弄れるようになったから次はプロトコルをすっ飛ばしてなんて考えてないからね絶対!!!

memcpy 最適化

バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww

memcpy() compiled with vectorizing compilers


All current compilers for linux should support SSE2 auto-vectorization with

#include <string.h>
void *(memcpy)(void *restrict b, const void *restrict a, size_t n){
    char *s1 = b;
    const char *s2 = a;
    for(; 0<n; --n)*s1++ = *s2++;
    return b;
}

(中略)


x86-64 gcc memcpy()


(中略)


Linking in a user-compiled memcpy(), using the source code presented above, nearly always improves performance. In the cases where the glibc fails to find needed wide moves, performance increases by a factor of 3.

no title

6月17日追記:

記事のコードは restrict をつける位置が間違っていると思います。gcc 4.1.2 において、以下のコードで自動ベクトル化されることを確認しました (-m64 -ftree-vectorize -msse2)

void *memcpy(void *b, const void *a, size_t n)
{
  char *__restrict__ s1 = b;
  const char *__restrict__ s2 = a;
  for(; 0<n; --n)*s1++ = *s2++;
  return b;
}
Connection: close