KMCの例会講座で用いたスライドを一部編集したものです。 ビット演算を組み合わせたトリッキーな方法で様々な操作を高速に行う方法を紹介します。
Very nice! Is there any plan to enable #[target_feature] attributes for things other than functions? For example, I’d expect that applying #[target_feature] to a module or an impl would be the same as applying it to every function or method in that module or impl. Instead, it seems to currently result in an ICE. Yes, I know about this RFC, but I don’t think it’s the best approach either. I had in
GEMM: From Pure C to SSE Optimized Micro Kernels Note: Unfortunately on NA Digest I posted the https URL of this site. As our server uses only a self signed SSL certificate that is inconvenient, e.g. some browsers will not display formulas properly even if you trust the certificate. Use the http URL http://apfel.mathematik.uni-ulm.de/~lehn/sghpc/gemm/index.html instead. In the mean time I will ord
Format Apache Arrow defines a language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware like CPUs and GPUs. The Arrow memory format also supports zero-copy reads for lightning-fast data access without serialization overhead. Learn more about the design or read the specification. Libraries Arrow's libraries implement t
The document discusses and benchmarks various string search algorithms, including Quick Search, strstr, and a custom implementation using SSE4.2 instructions. It finds that for short substrings, strstr in GCC utilizing SSE4.2 performs best, while for longer substrings, a modified Quick Search algorithm is faster. The author's own implementation using pcmpestri outperforms all other algorithms, bei
SIMD 演算と Intel AVX Single Instruction Multiple Data (SIMD) 演算とは1回の命令で複数のデータを同時に処理する演算です.近年の CPU には SIMD 演算を行うことができる SIMD 演算器が搭載されており,Intel 社の CPU ならば Streaming SIMD Extensions (SSE) を用いることで SIMD 演算を行うことが可能です.SSE は CPU に搭載されている 128bit レジスタを用いて演算を行うため単精度データならば4つ,倍精度データならば2つずつ演算を行うことができます.また,近年 SSE 後継の SIMD 拡張命令として Intel Advanced Vector eXtentions (AVX) が登場しました.AVX は第2世代 Intel Core i シリーズのプロセッサ (Sand
Auto-Vectorization in LLVM¶ LLVM has two vectorizers: The Loop Vectorizer, which operates on Loops, and the SLP Vectorizer. These vectorizers focus on different optimization opportunities and use different techniques. The SLP vectorizer merges multiple scalars that are found in the code into vectors while the Loop Vectorizer widens instructions in loops to operate on multiple consecutive iteration
Intersection of sorted lists is a cornerstone operation in many applications including search engines and databases because indexes are often implemented using different types of sorted structures. At GridDynamics, we recently worked on a custom database for realtime web analytics where fast intersection of very large lists of IDs was a must for good performance. From a functional point of view, w
はじめに 現代のCPUではSIMD(Single Instruction Multiple Data)命令を利用することができる. SIMD命令とはその名の通り,ひとつの命令で複数のデータを処理するものである. Intel系のCPUでは,MMX/SSE/AVX/AVX-512といったSIMD命令が利用可能であり,ARM CPUではNEONというSIMD命令が用意されている. 各SIMDとSIMD用のレジスタの対応関係は以下のようになる. 項目 利用可能レジスタ MMX 64bit のMMレジスタ SSE 128bit のXMMレジスタ AVX 256bit のYMMレジシタ AVX-512 512bit のZMMレジシタ ARM NEON 64bitのD(Double-Word)レジスタおよび128bitのQ(Quad-Word)レジスタ これらのレジスタを用いて,例えば4つのint型を一
はじめに 前回の記事では,Intel系のCPUとARM系のCPUのSIMD命令紹介した. 記事中のサンプルコードで,画像の2倍の拡大を行うコードがあり,その中でインタリーブを行っていた. SSEであれば,単純にunpack命令を実行するだけでよかった. 簡単なサンプルコードと出力結果は以下の通り. // $ g++ -std=gnu++14 -march=native main.cpp -o main #include <iostream> #ifdef _MSC_VER # include <intrin.h> #else # include <x86intrin.h> #endif // _MSC_VER static inline void showAVX128(const __m128i& v128) noexcept { alignas(alignof(__m128i)) uns
この記事は、「ElixirからRustの関数をつかう → はやい」の続編だ。今回は、前回の記事で最速だった Rust によるマルチスレッドプログラムを、少ない労力で SIMD 化して、さらなる高速化を図る。 実はコード自体は少し前に書いてあったのだが、なかなか本文を書き進める時間がとれず、今回は、駆け足で説明することになってしまった。説明不足な点があると思うので、疑問とか、試してみたけどうまくいかないとかあれば、コメント欄で質問してほしい。 前回やったこと 前回 の記事では、Elixir から Rust の関数を呼ぶことで、円周率の近似値を求める計算を高速化した。計算方法は「数値積分法の長方形近似」という、とても素朴な方法だった。 これを選んだのは次のような理由だった。 実装が非常に簡単 計算が適度に重い マルチコア CPU を活かしたプログラムを書きやすい 以下の段取りで、計算にかかった
サイボウズ・ラボの光成です。 今回はC/C++用文字検索ライブラリmie_stringを紹介します。 mie_stringはテキストの中から複数文字のいずれかが存在する場所を高速に検索する関数を提供します。 本文ではその使い方と性能を紹介します。また後半ではSIMD命令を使うときに悩ましい端数処理について詳解します。 準備 mie_stringではCのintrinsic関数(SSE4.2)を使ったものとアセンブリ言語で書いたものの二つを用意しました。 intrinsic関数を使う場合はMIE_STRING_INLINEを定義してからmie_string.hをincludeしてください。 これ以外のファイルは不要です。C/C++のどちらからも使えます。 includeするだけでつかえるので簡単ですね。 なお、コンパイルオプションにはgcc/clangなら-msse42や-mavx、Visua
この記事はフューチャーアーキテクト Advent Calendar 2015の12/5です。 Rustとは、Mozillaが開発しているプログラミング言語です。 Rustは低レイヤ用のシステムプログラミング言語ですが、クロージャーやトレイトなどの今どきな機能を使えるという特徴があります。 最近、RustでもSIMDを使えるというのを知りました。 なので今日はRustのSIMDプログラミングを説明します。 SIMD(Single Instruction Multiple Data)とは、複数のデータに対して同じ命令を適用する計算機構のことです。IntelのAVXやGPGPUの並列コンピューティングがこれに該当します。下にイメージ図を書きます。 上図ではaとbの同インデックスの値を加算し、それぞれの結果をcに格納しています。このような計算をまとめて実行するのがSIMDです。 Intel CPU
現代CPUによる高速計算処理 ネットワークシステム研究室 指導教員 : 坂本 直志 准教授 08nc015 : 小林 芳文 目次 1.はじめに 2.高速計算 2.1 高速計算とは 2.2 計算手法 3.現代CPUの進化 3.1 コプロセッサ 3.2 SIMD 3.3 CPUとコンパイラ 3.4 ベンチマークテストプログラム 4.実験 4.1 FORTRAN 4.2 C言語への移植 4.3 SIMD化したプログラム 5.まとめと今後の課題 6.参考文献 7.付録 1.はじめに 近年、CPUの処理速度能力はSIMD演算の実装やプロセッサのマルチコア化等により、飛躍的に進化している。これに伴い、コンパイラもCPUに対応するように進化している。 そこで本論文では、現代のCPUの機能を活用し、限られた計算資源をより効率的に処理することで処理速度がどの程度向上するのかを観測した。 処理速度の高速化の対
今年もPostgreSQL Advent Calendar 2015に参加しています。 前からちょくちょく『PG-StromってXeon Phiだとどーなんですか?』的な質問を受ける事があんですが、データ構造から見て難しいので『勘弁!』という理由を紹介してみたいと思います。 PostgreSQLのレコードは、内部的には HeapTupleHeader 構造体を先頭とする可変長データとして表現されています。 struct HeapTupleHeaderData { union { HeapTupleFields t_heap; /* MVCC関連情報 */ DatumTupleFields t_datum; /* xmin, xmaxとか... */ } t_choice; /* current TID of this or newer tuple */ ItemPointerData t_
A new scheme for SIMD in Rust is available in the latest nightly compilers, fresh off the builders (get it while it’s hot!). For the last two months, I’ve been interning at Mozilla Research, working on improving the state of SIMD parallelism in Rust: exposing more CPU instructions in the compiler, and an in-progress library that provides a mostly-safe but low-level interface to that core functiona
以前から気になっていたSIMDプログラミングをGoでやってみた。 Single Instruction Multiple Data (SIMD) 演算とは1回の命令で複数のデータを同時に処理する演算です.近年の CPU には SIMD 演算を行うことができる SIMD 演算器が搭載されており,Intel 社の CPU ならば Streaming SIMD Extensions (SSE) を用いることで SIMD 演算を行うことが可能です.SSE は CPU に搭載されている 128bit レジスタを用いて演算を行うため単精度データならば4つ,倍精度データならば2つずつ演算を行うことができます.また,近年 SSE 後継の SIMD 拡張命令として Intel Advanced Vector eXtentions (AVX) が登場しました.AVX は第2世代 Intel Core i シリ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く