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…