アセンブラー

一次元配列同士の加算、アセンブリ言語(AVX512)で記述

一次元配列同士の加算する。呼び出し側をC++で、加算処理をAVX512アセンブリ言語で記述した例を示す。 まず、単純な例を示す。

一次元配列へスカラーの加算、C++、アセンブラー、SIMD

一次元配列へスカラー値を加算します。C++、x86アセンブラー、AVX2、AVX-512の例を示します。

SIMD、(ゼロ)マスク移動、アンアラインド

AVX-512 イントリンシックでマスク、またはゼロマスクを使った移動。データはSIMD境界に揃っていない。

SIMD、ゼロマスク移動

AVX-512 イントリンシックでゼロマスクを使った移動。

SIMD、マスク移動

AVX-512 イントリンシックでマスクを使った移動。

C++とアセンブラー⑦

C++とアセンブラーで開発した関数について一通り解説してきた。今回は、戻り値を持つ関数の説明を行う。 戻り値がchar 戻り値がshort 戻り値がint 戻り値がポインター 戻り値が単精度浮動小数点 戻り値が倍精度浮動小数点

C++とアセンブラー⑥

C++とアセンブラーで開発した関数について一通り解説してきた。今回は、スタックへレジスターの保存を行うだけでなく、スタックに作業領域を割り当てて使う方法を紹介する。レジスターの保護と、作業領域確保の両方を行う例を紹介する。

C++とアセンブラー⑤

C++とアセンブラー④で紹介したように、xmmレジスターを保護しただけでは、ymmレジスターやzmmレジスターの保護が保証されないことが分かった。そこで、ここでは512ビットのSIMDをサポートしたCPUはzmmレジスターを、256ビットのSIMDをサポートしたCPUはymmレ…

C++とアセンブラー④

Visual Studio のC++が呼び出すアセンブリ関数でレジスターを保護する方法を紹介したが、xmmレジスターまでしか考慮していない。ymmレジスターやzmmレジスターを搭載したCPUで、本当にxmmレジスターをほごするだけで良いのか考察してみる。 保存するSIMDレジ…

C++とアセンブラー③

Visual Studio のC++からアセンブリコードで記述した関数を紹介したが、レジスターの退避が十分とは言えませんので、破壊してはならないレジスターを保護する例を紹介する。

C++とアセンブラー②

Visual Studio でプラットフォームにx64 を選ぶとインラインアセンブラを使用できない。理由はスタックやレジスターの管理など、いろいろ考えられる。インラインアセンブラを使用できないということは、アセンブリコードは別のファイルに単独で記述しなけれ…

C++とアセンブラー①

まず、Visual Studio のx86でC++とアセンブリ言語を混在して使用する方法を紹介します。X86ではインラインアセンブラを利用できますので、比較的簡単に記述できますが、C++はもちろん、アセンブリ言語を理解しておくのは前提です。

C++とアセンブラーでCPU機能を読み出す

CPUの機能を読み出し、それを表示してみましょう。 arques.hatenablog.com のアゼンブラーバージョンです。

C++とアセンブラーでCPUのキャッシュ情報を表示する

キャッシュ情報を読み込み表示してみましょう。 arques.hatenablog.com のアゼンブラーバージョンです。

C++ とアセンブラでベンダー名を読み出す

CPUのベンダー名を読み出し、それを表示してみましょう。 arques.hatenablog.com のアゼンブラーバージョンです。

C++ とアセンブラでCPU を読みだす。

CPUのプロセッサ情報を読み出し、それを表示してみましょう。 arques.hatenablog.com のアゼンブラーバージョンです。

C++とアセンブラでCPU brand stringを表示

CPU brand stringを、C++から自身で開発したアセンブリ関数を呼び出し、表示してみた。 arques.hatenablog.com のアゼンブラーバージョンです。