タグ

SIMDに関するk_oshimaのブックマーク (2)

  • 或るプログラマの一生 » UTF-8のコードポイントはどうやってもっと高速に数えるか

    Qiita に UTF-8のコードポイントはどうやって高速に数えるかという記事がありました。コードを眺めながらもっと速くなるんじゃないのと思ったので、やってみようと思います。 元のコードはこうなっています。 inline int32_t avx2_horizontal_sum_epi8(__m256i x) { __m256i sumhi = _mm256_unpackhi_epi8(x, _mm256_setzero_si256()); __m256i sumlo = _mm256_unpacklo_epi8(x, _mm256_setzero_si256()); __m256i sum16x16 = _mm256_add_epi16(sumhi, sumlo); __m256i sum16x8 = _mm256_add_epi16(sum16x16, _mm256_permute2x1

  • UTF-8のコードポイントはどうやって高速に数えるか - Qiita

    UTF-8文字列からコードポイント数を計算するアルゴリズムについて紹介します。コードポイント数カウントは、シンプルに書くのはそれほど難しくないものの、高効率な実装は意外にややこしいです。 内容は二立てです。 実践的な実装について、Ruby(CRuby)の内部実装(string.c)で使われているものを紹介します。 標準Cの範囲を超えて、SIMD命令(AVX/AVX2)を使った実装についても述べます 軽く検索する限りだと既知のアルゴリズムが見当たらなかったので、アドホックな実装をひねり出しましたが、そんなに効率は悪くなさそうです おまけで簡単な性能評価をやってみました。 なお、UTF-8文字列はバリデーション済み(不正なシーケンスでないことが分かっている)であるとします。 Rubyの内部実装だとどうやっているか まずは、それがコードポイントの先頭バイト(leading byte)かを判定す

    UTF-8のコードポイントはどうやって高速に数えるか - Qiita
  • 1