こんばんは @sleepy_yoshi です.Machine Learning Advent Calendar 2012 の11日目を担当します.サモア時間ではまだ12月11日なので間に合いましたね.今日はバイナリ素性ベクトルの内積計算にSSE4.2のpopcnt命令を用いて高速化することでk-NN分類器を高速化する話について書きます. このブログでは普段である調で書いていますが,今日はなんとなくですます調で書きます. k-NN (k Nearest Neighbor) 分類器はラベルを予測したい事例に対して,訓練データとして与えられたラベル付き事例集合の中からk近傍の事例のラベルを用いて予測する,という分類器です.k近傍を求めるために,訓練データに含まれる事例全てに対する類似度を計算する必要があります.類似度には様々な尺度が利用されますが,ここでは内積とします.そのためk個の近傍を発見す
SIMDの無駄遣い CodeIQ における先の Kawazoe(@riverplus)氏出題のビット数え上げ問題について、敢えてダメな解法を追求してみようと思う。 今回試してみるのは「力技」だ。 (どんな問題だったかはこちらを参照) http://qiita.com/Seizh/items/dbe5c95acd58d2d18b63 x86のpopcnt命令を直接呼び出せば多少は速くなる。そんなのは誰でも思いつくだろう。 popcntを超えるスループットが必要だ。 そうだ、AVX2使えばpopcntより高速なビット数え上げルーチンを作れるんじゃね?と思ったのが、例の漸化式を使って解いた回答の提出後。 もちろんこんなバカな回答を出したら最低クラスの点をもらうことは覚悟せねばならないので提出もしないままお蔵入りするつもりだったが、せっかくだからお披露目しよう。 実装例(C++) C++といいつつ
ループカウンタを64bitにしたり、 バッファのサイズを定数にしたらパフォーマンス激落ちなんだけど何で? c++ - Replacing 32bit loop count variable with 64bit introduces crazy performance deviations - Stack Overflow stackoverflowで、興味深い質問が行われている。 簡単にまとめるとこうだ。std::uint64_t型の配列の各要素にx86-64のpopcnt(1になっているビット数を数える命令)を適用したい。 コードの肝心の部分を書くと、以下のようになる。 for (unsigned i=0;i<size/8;i+=4) { count+=_mm_popcnt_u64(buffer[i]); count+=_mm_popcnt_u64(buffer[i+1]); coun
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く