この記事は「Fortran vs. C offload directives and functions」(http://software.intel.com/en-us/articles/fortran-vs-c-offload-directives-and-functions) の日本語参考訳です。
この “一覧表” は、インテル® Xeon Phi™ コプロセッサー向けのプログラミングにおける Fortran と C/C++ のオフロード宣言子/指示句と関数をまとめたものです。
|
Fortran (明示的モデル) |
C/C++ (明示的モデル) |
C/C++ (暗黙的モデル) |
インクルード |
use mic_lib |
#include offload.h |
#include cilk.h |
関数 |
result = offload_number_of_devices() |
result = |
|
|
result = offload_get_device_number() |
result = |
|
|
offload_report(n) |
__Offload_report(n) |
|
|
omp_set_num_threads_target( TARGET_MIC, mic_num, num_threads) |
omp_set_num_threads_target( TARGET_MIC, mic_num, num_threads) |
|
|
その他の API は、Fortran のインクルードファイルを参照; /opt/intel/include/intel64/mic_lib.f90 |
その他の API は、C/C++ のインクルードファイルを参照; |
その他の API は、C/C++ のインクルードファイルを参照; /opt/intel/include/offload.h |
前処理と |
基本的に Fortran と C/C++ で同一ですが、マクロが #ifdef MACRO_NAME …#else … #endif で利用される場合、Fortran のファイル名は f90 ではなく F90 であるか、コマンドラインに –fpp オプションが必要です。 |
||
宣言子(Fortran)/指示句(C/C++) |
|||
次の文を |
!dir$ offload target <文> は、 call subroutine_name(args) もしくは、 ret_val = function_name(args) |
#pragma offload target(mic[:n]) <オフロードのオプション節> <文> は、if 文、for 文、もしくは単純なブロック文({s1; s2; s3; …} など)からなる完全な C/C++ 構文 |
ret_val = ret_val =_Cilk_offload_to n function_name(vars) ret_val = ret_val = |
コードのブロックを含むOffload |
!dir$ offload begin target <文> !dir$ end offload |
上記の完全な文を参照 |
|
OpenMP parallel セクション(もしくはcilk_for 構造) を |
!dir$ [omp] offload target(mic[:n]) <オフロードのオプション節> !$omp <parallel 宣言子><文> !$omp <end 宣言子> |
#pragma offload target(mic[:n]) <オフロードのオプション節> #pragma omp <parallel 指示句><完全な構文> |
ret_val = ret_val = |
コプロセッサーへ非同期データ転送を開始 |
!dir$ offload_transfer <in_offload 節> signal(signal 変数) |
#pragma offload_transfer<in_offload 節> |
|
コプロセッサーからの非同期データ転送の完了を待機 |
!dir$ offload_transfer wait(signal 変数) |
#pragma offload_transfer |
|
Offload 待機 |
!dir$ offload_wait(signal 変数) |
#pragma offload_wait(&signal 変数) |
|
関数やサブルーチンをホストとコプロセッサーの両方で必要なことをマーク |
!dir$ attributes offload:mic :: ルーチン名 |
__attribute__ ((target(mic))) 関数宣言 __declspec(target(mic)) |
関数型 C_Cilk_offload 関数宣言 |
グローバル変数をホストとコプロセッサーの両方のメモリーに割り当てることをマーク |
!dir$ attributes offload:mic :: 変数名 |
__attribute__ ((target(mic))) 変数宣言 __declspec (target(mic)) |
_Cilk_shared 変数宣言 |
囲まれた範囲をホストとコプロセッサーの両方のバージョンを用意するようにマーク |
!dir$ options /offload-attribute-target=mic !dir$ end options |
#pragma offload_attribute #pragma offload_attribute(pop) |
#pragma offload_attribute #pragma offload_attribute |
ホストとコプロセッサーの共有メモリー領域にメモリーを割り当てる |
ptr = ptr = _Offload_shared_free(ptr) _Offload_shared_aligned_free |
||
宣言子/指示句におけるOffload 節 |
|||
|
if(条件) 条件が .true. か .false. かを評価 |
if(条件) 条件が 0 か 1 かを評価 |
|
|
signal(signal 変数) |
signal(&signal 変数) |
|
|
wait(変数) |
wait(&変数) |
|
Fortran と C++ で同じ |
in(変数リスト[:修飾子]) |
in(変数リスト[:修飾子]) |
|
out(変数リスト[:修飾子]) |
out(変数リスト[:修飾子]) |
||
inout(変数リスト[:修飾子]) |
inout(変数リスト[:修飾子]) |
||
nocopy(変数リスト[:修飾子]) |
nocopy(変数リスト[:修飾子]) |
||
in、out、inout そして nocopy 節で利用できる修飾子 |
|||
length(要素数) |
length(要素数) |
||
alloc_if(条件) |
alloc_if(条件) |
||
free_if(条件) 条件が .true. か .false. かを評価 |
free_if(条件) 条件が 0 か 1 かを評価 |
||
align(アライメントするバイト数) |
align(アライメントするバイト数) |
||
alloc([最初のインデックス:最後のインデックス]) |
alloc([最初のインデックス:要素数]) |
||
into(変数名) |
into(変数名) |
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。