C/C++

Intel OpenCL を使ってみる

概要 前回インストールした Intel OpenCL の使い方のメモサンプルコードには以前紹介した以下のコードを用いる OpenCL で deviceQuery ぽいものを作ってみた - kawa0810 のブログ コンパイル方法 $ g++-4.8.2 deviceQuery.cpp -I/usr/include/CL -L/usr/lib6…

CentOS に Intel OpenCL をインストールする

概要 CentOS 6.5 に Intel OpenCL をインストールした際のメモ ※ 本来 CentOS は Intel OpenCL のサポート外なので参考にする際は自己責任で作業してください 方法 1. OpenCL SDL と Runtime をダウンロードする Intel® SDK for OpenCL™ Applications | Inte…

静的ライブラリと共有ライブラリの整理 - その3 -

静的ライブラリ・共有ライブラリ作成時の注意点 ※ 他にいい方法があるかもしれないのでご参考程度. C++ で静的ライブラリ・共有ライブラリを作成する際は関数に extern "C" をつけてビルドする必要がある.しかしながら,extern "C" をつけてビルドしている…

静的ライブラリと共有ライブラリの整理 - その2 -

概要 C++ における静的ライブラリと共有ライブラリの作成・使用方法を整理 基本的な作成方法・使用方法は C と同じ (静的ライブラリと共有ライブラリの整理 - その1 - - kawa0810の日記) C++ はプロトタイプ関数に extern "C" を付与 オーバーロード関係は次…

静的ライブラリと共有ライブラリの整理 - その1 -

概要 C言語における静的ライブラリと共有ライブラリの作成・使用方法を整理. 静的ライブラリ コンパイル時にリンクする ファイル名は libxxx.a (Windows なら xxx.lib) オブジェクトファイルを ar コマンドを使用して作成 共有ライブラリ プログラム実行時…

関数ポインタのあれこれ

関数ポインタ関係の自分用まとめ. 関数ポインタ 戻り値の型 (*関数ポインタを管理する名前)(仮引数) = 関数 double test_add(double x, double y){ return x + y; } double (*func_test_add)(double, double) = test_add; std::cout << func_test_add(1.0, …

Boost 1.53 を Boost.MPI 込みでインストールした手順のまとめ

主旨 前回 (さくら VPS 上に gcc4.8 をインストールする方法 - kawa0810の日記 ) の GCC 4.8 をインストール後に Boost 1.53 を Boost.MPI 込みでインストールした際の自分用まとめ記事です. インストールに使用したもの OpenMPI 1.6.4:Open MPI: Open Sou…

さくら VPS 上に gcc4.8 をインストールする方法

主旨 GCC 4.8.1 *1 をさくらインターネット社の VPS *2 上の CentOS にインストールした際の自分用まとめ記事です.今回は CentOS 6.4 に GCC 4.8.1 をインストールします.GCC も 4.8.1 となり,C++11 のコア機能が全て実装されたようです. 今回は VPS を…

OpenCL でベクタ演算 (SIMD) を試してみる - その1 -

主旨 OpenCL でベクタ演算 (SIMD) を試してみます.問題はOpenCL をさわってみる - kawa0810の日記 で取り扱った配列同士の加算演算のベクタ演算 (SIMD) 化を考えます.また,プログラムはオンラインコンパイルで作成します. OpenCL でベクタ演算 (SIMD) Op…

gcc4.8 でメモリアライメント管理が使用可能になった

メモリアライメントについて gcc4.8 においてメモリアライメント管理である alignas と alignof の使用が可能となりました.alignas と alignof は C++ 0x から言語的にサポートされており*1,alignas と alignof を使用してプログラムを記述することでコン…

OpenCL をさわってみる ver.2

主旨 OpenCL をさわってみる - kawa0810の日記 のオフラインコンパイル版です. OpenCL の環境は Apple OpenCL (Mac 環境) を想定しています.参考:Mac Developer Library カーネルコード /*-------------------- kernel.cl --------------------*/ __kerne…

「OpenCL で deviceQuery ぽいものを作ってみた」の補足

主旨 2013-04-13 - kawa0810の日記の補足です. clGetPlatformIDs //使用可能なプラットフォーム情報を取得する cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id* platforms, cl_uint* num_platforms) - num_entris: 取得するプラットフォーム…

OpenCL で deviceQuery ぽいものを作ってみた

deviceQuery とは... deviceQuery とは GPGPU 向け SDK である CUDA に含まれているデバイス情報を取得するサンプルコードです(CUDA Samples :: CUDA Toolkit Documentation).今回は OpenCL を使って搭載されているデバイス情報を取得する (deviceQuery ぽ…

OpenCL をさわってみる

OpenCL OpenCL はマルチプラットフォーム環境で並列コンピューティングを行うために開発された言語です.詳細は Wikipedia 等をご覧頂くほうがいいと思います (OpenCL - Wikipedia).OpenCL を使うことで GPU や Cell/B.E. 等の環境で並列計算を同じビルド環…

clang で std::thread を使う際はコンパイルオプションに -stdlib=libc++ も必要

clang で std::thread を使う際はコンパイルオプションに -stdlib=libc++ も必要 先日,作業してて詰まったのでメモ書き.clang で std::thread を使う際はコンパイルオプションに -std=c++11 だけではなく -stdlib=libc++ も必要でした. $ clang++-mp-3.3 …

Mac で AVX + マルチスレッドを試してみる - その2 -

主旨 Mac で AVX + マルチスレッドを試してみる - その1 - - kawa0810 のブログ の続きです. Pthread + AVX on OSX 環境を試した結果です.問題は前回に続き総和計算(マルチスレッドプログラミングで総和計算 - その1 Pthread 編- - kawa0810 のブログ)を…

Mac で AVX + マルチスレッドを試してみる - その1 -

久々に Intel AVX の記事です 久々に Intel AVX の記事です.Intel AVX の概要や簡単な説明は過去の記事をご確認ください. Intel AVX を使用して SIMD 演算を試してみる - kawa0810 のブログ 第2回闇鍋プログラミング勉強会で発表してきました - kawa0810 …

Mac で無理矢理 Intel Intrinsics Guide を見る方法

Intel Intrinsics Guide Intel 社は 「Intrinsics Guide for Intel(R) AVX2 (Intel Intrinsics Guide)」 という Intel SSE 系や Intel AVX 系などの命令をまとめたアプリケーションを提供してくれています.Intrinsics Guide for Intel(R) AVX2 を使うことで…

SIMD 演算で if 文の並列化 - その2 -

2012-10-20 - kawa0810の日記の続きです.今回は SIMD 演算の実用編(?)として,モンテカルロ法を用いて円周率を求めます.ただし,整数の AVX は Haswell から対応なので,円の内側の点数を数える際に整数ではなく浮動小数点を使用してます.また,乱数の…

SIMD 演算で if 文の並列化 - その1 -

今月は SIMD 演算で条件分岐(if 文や三項演算子)の並列化を行います.SIMD で条件分岐を計算するには mask の概念の理解が必要になることや,SSE 世代と AVX 世代で条件分岐を計算する関数の使用方法が変わっているので今回は簡単にご紹介します. SSE と …

第2回闇鍋プログラミング勉強会で発表してきました

闇鍋プログラミング勉強会 第2回闇鍋プログラミング勉強会で発表してきました.闇鍋プログラミング勉強会についてはこちら (第2回 闇鍋プログラミング勉強会 : ATND) を参照ください.当日は道に迷ったり,エクストリーム資料作成したり,会場がキレイすぎて…

マルチスレッドプログラミングで総和計算 - その4 OpenMP 編-

kawa0810 のブログ の続きです. 最後は OpenMP について取り扱います. OpenMP Open Multi-Processing (OpenMP) はプログラム中の並列化したい箇所に OpenMP の規約に伴う指示文(ディレクティブ)を記述することで,指定した部分のプログラムをマルチスレ…

マルチスレッドプログラミングで総和計算 - その3 Win32 API 編-

kawa0810 のブログ の続きです. 今回は Win32 API を用いたマルチスレッドプログラミング方法を取り扱います. Win32 API を用いてマルチスレッドプログラミング Win32 API にはスレッドを作成・実行するために以下のような関数が用意されています.また,…

マルチスレッドプログラミングで総和計算 - その2 std::thread & std::async 編-

2012-08-04 - kawa0810の日記 の続きです. 今回は C++11 で追加された機能の一つである std::thread を用いて総和計算の高速化を考えます. std::thread と std::async について std::thread は C++11 から追加されたスレッド操作のライブラリです.std::th…

マルチスレッドプログラミングで総和計算 - その1 Pthread 編-

Pthread とは 近年,マルチコアプロセッサの普及に伴い,複数のプロセッサを利用する並列・並行プログラムの開発が求められています.POSIX Thread (Pthread) は POSIX 標準のスレッドであり,Pthread を用いることでスレッドの生成・実行・制御が可能となり…

メモリアライメントを意識した動的確保を行う際は posix_memalign が良いぽい

posix_memalign() が良い理由 本ブログでは今まで _mm_malloc() を使用してメモリアライメントを揃えていましたが,posix_memalign() を使用したほうが良いぽいです.理由は _mm_malloc() が Intel CPU 環境でのみ動作するのに対し,posix_memalign() は標準…

Boost.MPI を使って総和を計算

MPI を使って総和を計算 MPI を使って総和などを計算する場合,MPI_Reduce を使って各計算機の計算結果を足し合わせる作業が必要となります.MPI_Reduce の使い方は以下のような感じです. MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatyp…

Mac で Boost.MPI を動かしてみた

Boost.MPI をインストールする Boost.MPI はデフォルトでインストールされないので Boost をインストールする際に追加でいれる必要があります.Linux 等の環境で Boost.MPI をインストールする方法は他の方々にまかせるとして,Mac で port を使ってインスト…

SIMD 演算におけるキャッシュ制御方法とか

キャッシュ制御は重要 (?) プロセッサに近いメモリの順番は, メインメモリ ⇔ L3 キャッシュ ⇔ L2 キャッシュ ⇔ L1 キャッシュ ⇔ レジスタ ⇔ 演算器 という感じだと思います.SSE や AVX にはキャッシュ操作をサポートする命令が存在します.SSE 命令・AVX …

メモリアライメントを揃えずに SIMD する方法

メモリアライメントを揃えずに SIMD 演算する方法 今までは _mm_malloc() を使用してメモリアライメントを 32byte 境界に揃えてから AVX 命令で SIMD 演算をしていましたが,メモリアライメントを気にせずに AVX を用いて SIMD 演算する方法です.データを 3…

AVX で整数を SIMD 演算するには Intel AVX2 からのようですね

整数を SIMD 演算する方法 今まで浮動小数点型がメインだったのでたまには整数型の話です.ただし,Intel AVX 命令を使って整数型を SIMD 演算するには Intel AVX2 が必要であり,Intel AVX2 は次世代 CPU である Haswell に搭載のようなのでまだ使用するこ…

AVX と SIMD 演算と最大値の計算 - その2 -

前回 (2012-03-15 - kawa0810の日記) の続きです.前回のソースコードの問題点と対処方法です. 前回のコードの問題点 バグが混入している部分(単精度) ... auto vx = reinterpret_cast<__m256 const*>( x ); auto vmax = vx[0]; auto max = reinterpret_cast<float*>( &vmax ); .</float*></__m256>…

AVX と SIMD 演算と最大値の計算 - その1 -

AVX 命令を用いる SIMD 演算で最大値を求める 今回は AVX 命令を用いる SIMD 演算で最大値を求めてみます.考え方は前回の総和計算(2012-03-11 - kawa0810の日記)に近いと思われます. 最大値を求める AVX 命令は 単精度 (float) : _mm256_max_ps(__m256 ,…

AVX 命令を用いる SIMD 演算で総和を計算してみる

AVX 命令を用いる SIMD 演算で総和を計算する 今回は AVX 命令を用いる SIMD 演算で総和を計算してみます.SIMD 演算や AVX 命令については下記の URL を参照してください. 2012-03-03 - kawa0810の日記 さて,自分で総和計算のコードを書く場合は以下のよ…

Intel AVX を使用して SIMD 演算を試してみる - その5 - (最終回)

2012-03-06 - kawa0810の日記 の続きです. 今回は Fused Multiply Add (FMA) 命令についてです.ただし,現在 (2012/3/7日) 発売されている Sandy Bridge では FMA 命令は未対応のようですので注意してください. Why no FMA in AVX in Sandy Bridge? FMA …

Intel AVX を使用して SIMD 演算を試してみる - その4 -

2012-03-05 - kawa0810の日記 の続きです. 今回はその2 (2012-03-04 - kawa0810の日記) で紹介した AVX 命令を試します. 計算する問題 今回は SIMD 演算を用いてベクトルのスカラ倍 を計算する方法を考えます.ただし, はベクトルの要素数 = 2.0 とします…

Intel AVX を使用して SIMD 演算を試してみる - その3 -

2012-03-04 - kawa0810の日記 の続きです. 今回は SIMD 演算を行う際に問題となる端数の計算方法です. SIMD 演算を行う際に発生する端数の処理方法 AVX 命令を用いる SIMD 演算は 128bit 単位もしくは 256bit 単位で計算を行うため任意の長さのデータを計…

Intel AVX を使用して SIMD 演算を試してみる - その2 -

2012-03-03 - kawa0810の日記 の続きです. 今回は AVX 命令の組み込み関数の説明等です. データ型 AVX 命令で使用できる型は主に整数 (int),単精度 (float),倍精度 (double) です.また,AVX 命令は SSE 命令の拡張であるため 256bit 単位の演算だけでな…

Intel AVX を使用して SIMD 演算を試してみる

SIMD 演算と Intel AVX Single Instruction Multiple Data (SIMD) 演算とは1回の命令で複数のデータを同時に処理する演算です.近年の CPU には SIMD 演算を行うことができる SIMD 演算器が搭載されており,Intel 社の CPU ならば Streaming SIMD Extensions…