タグ

関連タグで絞り込む (2)

タグの絞り込みを解除

SIMDに関するyuroyoroのブックマーク (6)

  • SSEとAVXで高次元ベクトルの内積計算を高速化してみた | さかな前線

    世界最速のお魚と言えばカジキ類で,泳ぐ速度は時速100km/hを超えるとか.55ノット程になるのでこれはMk-48魚雷にも匹敵するほどです. 一方ちょっとチートな高速お魚としては,お馴染みトビウオが飛行中に最大70km/hほどに達するとか. 今日はそんな若干チートな高速化のお話(?)ということで,SSE組み込み命令について. SSEやAVXといえばお馴染みSIMD命令で,それをプログラムから構造体と関数の形式で高移殖に記述する方法がSIMD組み込み関数(SIMD Intrinsic)なわけですが,これを使ってごく典型的なベクトルの内積計算を高速化してみました. ベクトルの内積の高速化と言えば星の数ほどもされてる話なわけで,いまさら魚の情報なんか役に立つ気は全くしないのですが,純粋に自分でやらないとわかんない>< ということで, とにかく書いてみよう 効果の程はいかに? を調べてみたくて,や

  • AVX で遊んでみる - Algorithmer’s note

    今年の1月に発表されたIntelの新CPU「Sandy Bridge」から搭載された新機能に、「AVX」というものがあります。AVXを用いると、256ビットのレジスタを用いて、例えばdouble型の計算を4つ同時に行うなど高速に演算をすることができます。 AVXを使うためには、専用のコードを書かなければいけませんが、C++では単体で(アセンブラを用いずに)AVX対応のコードを書くことができるので、いろいろ遊んでみました。 コードの作法 ・#include "immintrin.h" を記述 AVXを使うための関数がここに記述されているので、includeします。 ・変数のalignment 変数の前に「_declspec(align(32))」というおまじないを書いておけば、自動で境界が32バイト境界になるように調整されます。このおまじないがあると、わりと何も考えなくてもAVX命令を使える

    AVX で遊んでみる - Algorithmer’s note
  • メモリアライメントを揃えずに SIMD する方法 - kawa0810 のブログ

    メモリアライメントを揃えずに SIMD 演算する方法 今までは _mm_malloc() を使用してメモリアライメントを 32byte 境界に揃えてから AVX 命令で SIMD 演算をしていましたが,メモリアライメントを気にせずに AVX を用いて SIMD 演算する方法です. データを 32byte 境界に揃えている場合は _mm_load_ps や _mm_load_pd が暗黙的に使われデータをロードします.計算したいデータが 32byte 境界に揃えていない場合は _mm_loadu_ps や _mm_storeu_ps 等を明示的に使用することで SIMD 演算を使用することが可能になります.ただし,オーバーヘッドが発生するため計算が遅くなるそうで可能な限りデータは 32byte 境界に揃えましょう. 総和計算のサンプルコード メモリアライメントを気にせずに総和計算をするサンプ

    メモリアライメントを揃えずに SIMD する方法 - kawa0810 のブログ
  • gccでintrinsicsでSSEでベクタライズする時の簡易的なまとめ - ぬうぱんの備忘録

    この記事は intrinsicsを使ってSSEでベクタライズするのに必要な足がかりを自分用にまとめたものです。 そもそもSSEって何 SIMD(http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions)を実現する拡張命令セットの名前。いろいろ種類があるしバージョンもある。基的な考え方をすごく乱暴に言うと、floatの掛け算を4回繰り替えすよりも4つのfloatの掛け算を一息にやったら早くね? という感じ。 intrinsicsって何 前述の通り、SSEとかAVXはCPUの命令なので直接使おうと思うと自分でアセンブラを書かなくてはいけない。が、既存のC++コードを何とかしたいというのが調べてる動機なのでgccのSIMD intrinsicsを使うことにする。このSIMD intrinsicsはコンパイラーの組み込み関数で、こいつらを使うこ

    gccでintrinsicsでSSEでベクタライズする時の簡易的なまとめ - ぬうぱんの備忘録
  • 組み込み関数(intrinsic)によるSIMD入門

    “Symbolic bounds analysis of pointers, array indices, and accessed memory reg...Masahiro Sakai

    組み込み関数(intrinsic)によるSIMD入門
  • introdunction to SIMD programming - primitive: blog

    Unite 2015 Tokyo の講演で詳細を話せなかったのが心残りだったので、大量のオブジェクトの更新処理についてこの場で書いてみます。 主に C++ で、簡単なパーティクルエンジンを作り、それを SIMD を用いて高速化する手順を解説します。 話を簡単にするため、以下の前提を設けます。 ・x86 環境のみ考慮 ・パーティクルは位置と速度のみを保持 ・パーティクル同士の相互衝突は総当たりで計算 総当たりなので超遅いですが、実装は容易で SIMD による恩恵を受けやすく、題材として手頃です。 この記事の中で引用されているソースの元は こちら、ビルド結果 (上のスクリーンショットのデモプログラム) は こちら になります。 相互衝突するパーティクルを実装する場合、お互いの距離を計算し、当たっていたらめり込み具合に応じて押し返す、というのがよくある実装だと思います。まずはそれをストレートに

    introdunction to SIMD programming - primitive: blog
  • 1