山口屋~活動日誌~

私生活で主な出来事をピックアップ

エラー E1696 ソース ファイルを開けません Windows SDK

2023-12-04 22:25:28 | ソフトウェア開発
エラー E1696 ソース ファイルを開けません

Visual Studio での上記エラーメッセージが、標準ライブラリヘッダファイルについて全部出てしまうような場合は、Windows SDK バージョンを確認し、プロジェクト毎に[構成プロパティ]→[全般]→[Windows SDK バージョン]で設定し直す。
PG日誌 (takap-tech.com):VC++でどのWindowsSDKを選択するべきか

stackoverflow:How do I specify which Windows SDK version qmake shall target?
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MPI 構造体 データ 送受信 派生データ型

2023-12-03 15:36:06 | ソフトウェア開発
MPI(Message Passing Interface)で構造体を送受信したいときは、MPI_Type_struct関数、MPI_Type_commit関数でMPIデータ型を定義してから送受信する。終了時にはMPI_Type_free関数でMPIデータ型をメモリ解放する。

int MPI_Type_struct(int count, const int *array_of_blocklengths, const MPI_Aint *array_of_displacements, const MPI_Datatype *array_of_types, MPI_Datatype *newtype)
count:メンバの個数
array_of_blocklength:各メンバの要素数を示す配列へのポインタ
array_of_displacements:各メンバのメモリオフセットを示す配列へのポインタ
array_of_types:各メンバのMPIデータ型を示す配列へのポインタ
new_type:MPIデータ型を表す変数へのポインタ

int MPI_Type_commit(MPI_Datatype *datatype)
datatype:MPIデータ型を表す変数へのポインタ

送受信する構造体メンバのメモリオフセットを知るためにはoffsetofマクロを使う。
#include <stddef.h>
#ifndef offsetof
#define offsetof(type, member) ((size_t)&((type*)0)->member)
#endif

int MPI_Type_free(MPI_Datatype *datatype)
datatype:MPIデータ型を表す変数へのポインタ

<参考>
・理化学研究所:MPIコミュニケータとデータタイプ
・理化学研究所:並列プログラミング入門 MPI版
・同志社大学工学部知的システムデザイン研究室:並列処理の導入2 MPIプログラムのチューニング
・C言語入門講座:構造体メンバーの位置を取得する
・noocyte のプログラミング研究室:4.構造体に関するマクロ
・標準Cライブラリの実装:stddef.h
・MSDN:データ型の範囲
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

リダクション演算 C/C++ OpenMP MPI Gather/Scatter ブロードキャスト マルチキャスト

2023-12-03 14:44:22 | ソフトウェア開発
OpenMPのリダクション演算は、C/C++ では Fortran と対応機能が異なるので注意。最大値と最小値には対応していない。(参考文献のpp.17)
<参考文献>
南里豪志、渡部善隆:OpenMP入門(2)、九州大学情報基盤センター広報、Vol.2, No.1, pp.1-40(2002.03)

MPIでデータ集約をする際、reduction 演算をせずに単に集めるなら MPI_Allgather と MPI_Gather が使える。MPI_Allgather は MPI_Gather を全プロセスで呼出した結果と同じになるが、バタフライのアルゴリズムで通信することで高速になるように工夫されている。(東京工業大学 廣瀬研究室:MPIリファレンス 3. 集団通信)MPI_Gather も MPI_Allgather もデータの個数は1プロセスのデータ集約前を指定する。データの個数が各プロセスで異なる場合は MPI_Gatherv と MPI_Allgatherv を使う。基本的にMPIの場合、送信バッファと受信バッファは必ずアドレスが異なっていなければならない。

MPIでデータ集約をする際、reduction 演算をするならば MPI_Allreduce と MPI_reduce が使える。位置を含めて最大値(MPI_MAXLOC)や最小値(MPI_MINLOC)を求める場合はデータ型にMPI_DOUBLE_INTを使う。(MPI_UNSIGNEDはあるがMPI_DOUBLE_UNSIGNEDはないようである。)ユーザー定義の reduction 演算をするならば、演算に使うデータ型(構造体)を MPI_Type_struct で定義、演算内容を MPI_Op_create で登録、といったことが必要である。
<参考URL>
理化学研究所 情報基盤センター 青山幸也:並列プログラミング入門 MPI版 2012年6月1日版(pp.34-39)

MPI_Gather とは逆の MPI_Scatter の各プロセッサの受信側バッファには先頭から詰めて値が書き込まれる。

プロセス総数と自己プロセスは MPI_Comm_size と MPI_Comm_rank で取得される。
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPIでブロードキャストでなくマルチキャストを使いたい場合には、MPI_Comm_split で、MPI_COMM_WORLD(全体)のコミュケータを color 値で分けられたコミュケータ群に分割する。MPI_COMM_WORLD(全体)のコミュケータが消滅するわけではない。MPI_Comm_group 等のコミュケータから作られるグループの操作をする関数もあるらしい。
<参考URL>
辻田祐一:コミュニケータとデータタイプ(→PDF
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MPI Visual Studio C++ 2017 Express MS-MPI

2023-12-02 22:52:28 | ソフトウェア開発
Microsoft Visual Studio(Express 2017 for Windows Desktop のオンラインインストーラー)で、MPI(Message Passing Interface)を利用するにはライブラリをインストールする必要がある。

●手順1.MS-MPI(Release Notes)のインストール
○msmpisdk.msi(include files, lib files)、msmpisetup.exe(mpiexec)の両方をインストール。

●手順2.Visual Studio の設定
○[プロジェクトのプロパティ]→[構成プロパティ]→[C/C++]→[追加のインクルード ディレクトリ]→$(MSMPI_INC)を追加
○[プロジェクトのプロパティ]→[構成プロパティ]→[リンカー]→[追加のライブラリ ディレクトリ]→$(MSMPI_LIB64)または$(MSMPI_LIB32)を追加

●手順3.ソースファイル内で記述
#include <mpi.h> //#define MPI_INCLUDED
#pragma comment(lib, "msmpi.lib")

<参考>
●Atsushi M. Ito's page:Visual Studio 2013におけるMS-MPI v6の利用
●Atsushi M. Ito's page:Visual Studio 2015におけるMS-MPIのデバッグ実行
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MPI ファイル 入出力

2023-12-02 19:42:53 | ソフトウェア開発
継続調査中。

MPI_File_set_view()は可搬性を高めるために利用が望ましい。

●MPI_File_open( MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh )

コミュニケータに属するプロセスで同じ関数を呼び出す。

MPI_Comm comm
:コミュニケータ

char *filename


int amode
:アクセスモード
- MPI_MODE_RDONLY 読込のみ可能
- MPI_MODE_RDWR 読込みと書き込みの両方可能
- MPI_MODE_WRONLY 書込みのみ可能
- MPI_MODE_CREATE ファイルが無い場合、新規作成
- MPI_MODE_EXCL 既にファイルがある場合にエラーを返す
- MPI_MODE_DELETE_ON_CLOSE ファイルを閉じる際に消去
- MPI_MODE_UNIQUE_OPEN 同時にファイルをオープンしない
- MPI_MODE_SEQUENTIAL 逐次的なファイルのオープン
- MPI_MODE_APPEND 全てのファイルポインタをファイル終端にセット

MPI_Info info
:MPI-IOに関するヒント

MPI_File *fh
:ファイルハンドル

●MPI_File_set_view( MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Datatype ftype, char *datarep, MPI_Info info )

全プロセスで呼び出しする。

MPI_File fh
:当該ファイルのファイルハンドル

MPI_Offset disp
:オフセット値

MPI_Datatype etype
:ファイルビューを表すftypeを生成する基になるデータ型

MPI_Datatype ftype
:ファイルビューを表すデータ型

char *datarep
:以下の3種類の内のどれかを指定
– native: メモリ中のバイナリデータ表現と同じ表現(同一計算機内での利用を想定したデータ表現)
– internal: 同一システム内で互換するデータ表現
– external32: 異なるシステム間でも互換性のあるデータ表現

MPI_Info info
:MPI_Infoオブジェクト(key,valueペアで指定されたパラメタ群)。特に設定するものが無い場合、MPI_INFO_NULLを引数に与える。

<参考>

東京大学情報基盤センター:「MPI基礎:並列プログラミング入門」ファイル入出力(pp.30)
理研AICS 辻田祐一:MPI-IO(pp.7-11)
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする