Fortran と C のオフロード宣言子/指示句と関数

同カテゴリーの次の記事

インテル® ハイパースレッディング・テクノロジー: よくある質問

この記事は「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 =
_Offload_number_of_devices()

result = offload_get_device_number()

result =
_Offload_get_device_number()

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++ のインクルードファイルを参照;
/opt/intel/include/offload.h

その他の API は、C/C++ のインクルードファイルを参照; /opt/intel/include/offload.h
環境変数は、Fortran と C/C++ で同じです

前処理と
マクロ

基本的に Fortran と C/C++ で同一ですが、マクロが #ifdef MACRO_NAME …#else … #endif で利用される場合、Fortran のファイル名は f90 ではなく F90 であるか、コマンドラインに –fpp オプションが必要です。


宣言子(Fortran)/指示句(C/C++)


次の文を
Offload

!dir$ offload target
(mic
[:n])<オフロードのオプション節>
<文>

<文> は、

call subroutine_name(args)

もしくは、

ret_val = function_name(args)

#pragma offload target(mic[:n]) <オフロードのオプション節>
<文>

<文> は、if 文、for 文、もしくは単純なブロック文({s1; s2; s3; …} など)からなる完全な C/C++ 構文

ret_val =
_Cilk_offload

function_name(args)

ret_val =_Cilk_offload_to n function_name(vars)

ret_val =
_Cilk_spawn _Cilk_offload
function_name(args)

ret_val =
_Cilk_spawn _Cilk_offload_to
n function_name(args)

コードのブロックを含むOffload

!dir$ offload begin target
(mic
[:n])<オフロードのオプション節>

<文>

!dir$ end offload

上記の完全な文を参照

OpenMP parallel セクション(もしくはcilk_for 構造) を
Offload

!dir$ [omp] offload target(mic[:n]) <オフロードのオプション節>

!$omp

<parallel 宣言子>

<文>

!$omp <end 宣言子>

#pragma offload target(mic[:n]) <オフロードのオプション節>

#pragma omp

<parallel 指示句>

<完全な構文>

ret_val =
_Cilk_offload _Cilk_for
(init-expr; test-expr; incr-expr) {}

ret_val =
_Cilk_offload_to
n _Cilk_for ( init-expr; test-expr; incr-expr) {}

コプロセッサーへ非同期データ転送を開始

!dir$ offload_transfer <in_offload 節> signal(signal 変数)

#pragma offload_transfer<in_offload 節>
signal(&signal 変数)

コプロセッサーからの非同期データ転送の完了を待機

!dir$ offload_transfer wait(signal 変数)
<out_offload 節>

#pragma offload_transfer
wait(&
signal 変数)
<out_offload 節>

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
(push,target(mic))

#pragma offload_attribute(pop)

#pragma offload_attribute
(push, _Cilk_shared)

#pragma offload_attribute
(pop)

ホストとコプロセッサーの共有メモリー領域にメモリーを割り当てる

ptr =
_Offload_shared_malloc (
size)

ptr =
_Offload_shared_aligned_malloc
(
data_size,alignment_size)

_Offload_shared_free(ptr)

_Offload_shared_aligned_free
(
ptr)


宣言子/指示句における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(条件)
条件が .true. か .false. かを評価

alloc_if(条件)
条件が 0 か 1 かを評価

free_if(条件)

条件が .true. か .false. かを評価

free_if(条件)

条件が 0 か 1 かを評価

align(アライメントするバイト数)

align(アライメントするバイト数)

alloc([最初のインデックス:最後のインデックス])

alloc([最初のインデックス:要素数])

into(変数名)

into(変数名)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事