タグ

Cとmathに関するkenjiro_nのブックマーク (7)

  • ベクトル/行列演算の定番ライブラリEigen - Qiita

    ベクトル/行列演算の定番ライブラリEigen (日語解説のサイトまとめと便利な機能紹介) Eigenとは C++の行列/ベクトルを扱うライブラリ(公式). Eigenの主な特長 行列演算を直感的に書くことが出来る. ヘッダーファイルのみのライブラリのため,ライブラリのビルドやリンクが必要なく組み込やすい. 高速.他のライブラリとの比較ベンチマークはこちら(公式) 解説サイト(すべて日語) Eigen - C++で使える線形代数ライブラリ(でらうま倶楽部)- 基的な使い方とも幾何変換,クォータニオンなどの解説もあり. Eigen ー C++で線形代数を!(singular point)- 3回のポストで,幅広い機能について解説している. Robotics/Eigen(NAIST::OnlineText)- 基的な機能の他に行列分解についても解説あり. Eigenの使い方 Eigenは

    ベクトル/行列演算の定番ライブラリEigen - Qiita
  • SIMDプログラミングによる行列積について

    C言語初心者です。 SIMD命令を使って8×8行列を計算するプログラムを書いたところ、"segmentation fault" が実行の度に起きたり起きなかったりする奇妙なことになってしまいました。 どこが間違いなのか、どう改善すべきなのか、教えていただけると幸いです。 またswitch文のところは、ポインタとiを使って計算すべき所だと思うのですが、なぜか変数を使うと "segmentation error" が起きてしまいます。これに関しても理由が知りたいです。 以下がコードです。 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <x86intrin.h> void print_vec(__m256 m) { printf("{"); for(int i=0;i<8

    SIMDプログラミングによる行列積について
  • 小行列演算におけるインテル® AVX の利点 | iSUS

    まとめ 8×8 行列の乗算アルゴリズムと 16×16 行列の加算アルゴリズムの両方で、それぞれ 1.77 倍と 1.8 倍となり、インテル® AVX バージョンのほうがインテル® SSE よりも優れた結果となりました。これは、インテル® AVX のほうが、レジスターの幅を活用することで 1 命令あたり 2 倍のオペランドを処理し、インテル® SSE よりも高いスループットを達成できることを示した良い例です。 行列式アルゴリズムでは、8 つの行列の行列式の計算を同時に実行することでパフォーマンスが向上しました。ただし、行列式の計算の前の 2 つの 8×8 転置により、パフォーマンスはやや制限されます。 一般に、アプリケーションはメモリー集約型よりも計算集約型のほうが、より優れたパフォーマンス・スピードアップが得られます。 ソースコード 完全なソースコードは http://software.i

    小行列演算におけるインテル® AVX の利点 | iSUS
  • SIMD - C++のメモ

    C++のメモ Visualization Tool Kit(VTK)など トップページページ一覧メンバー掲示板編集 SIMD 最終更新: sonogi1 2014年08月28日(木) 22:44:43履歴 Tweet SIMDはCPUが持っているベクトル演算機能である. ベクトル長は128bitや256bitと短いが,配列の個々の要素に同一の操作をする場合,2倍〜10倍程度の高速化が簡単に見込める. 組み込み関数が用意されているため,通常のC++でそのまま記述することができる. 命令についてはIntel Intrinsics Guideを参照. SIMDを用いた行列の積の高速化 アルゴリズム AVX(Sandybridge以降) AVX2(Haswell以降) ベンチマーク結果 SIMDを用いた行列の転置の高速化 アルゴリズム ベンチマーク SIMDを用いた行列の積の高速化 AVXのベクト

    SIMD - C++のメモ
  • SIMD演算を用いた高精度疎行列計算ソフトウェアの高速化-情報処理学会

  • いつからその方法で偏りのない乱数が得られると錯覚していた? - アスペ日記

    私はつい最近まで勘違いしていました。 ここのページに書いてあるような方法で、一様分布する整数が得られると。 int random(int n) { return (int)(( rand() / (RAND_MAX + 1.0) ) * n); } この方法、一見すると実に一様分布が得られそうに見えるんですよね。 どういう思考回路を通っているかというのを自己分析すると、次のような感じです。 1. rand() では 0〜RAND_MAX のランダムな整数が得られる。 2. それを RAND_MAX + 1 で割ると、[0, 1) に一様分布する実数が得られる。 3. [0, 1) の一様な実数を n 倍して小数点以下を切り捨てたら、0 から n-1 に一様分布する整数が得られる。 これの罠なところは、1 と(特に)3 が正しいというところだと思います。 ただ、2 がダウト。 思いっきりダウ

    いつからその方法で偏りのない乱数が得られると錯覚していた? - アスペ日記
  • IEEE floating-point exceptions in C++: 1.#IND, 1.#INF, etc.

    This page will answer the following questions. My program just printed out 1.#IND or 1.#INF (on Windows) or nan or inf (on Linux). What happened? How can I tell if a number is really a number and not a NaN or an infinity? How can I find out more details at runtime about kinds of NaNs and infinities? Do you have any sample code to show how this works? Where can I learn more? These questions have to

    IEEE floating-point exceptions in C++: 1.#IND, 1.#INF, etc.
  • 1