This is a "cheatsheet" comparing the Fortran and C++ offload directives and functions in the context of programming for the Intel® Xeon Phi™ Coprocessor
Fortran (explicit model) | C/C++ (explicit model) | C/C++ (implicit model) | |
---|---|---|---|
includes | use mic_lib | #include offload.h | #include cilk.h |
functions | 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) | ||
More APIs can be found in /opt/intel/include/intel64/mic_lib.f90 | More APIs can be found in /opt/intel/include/offload.h | More APIs can be found in /opt/intel/include/offload.h environment variables same for Fortran and C++ | |
preprocessor macros | same for Fortran and C++ but note - the macros are used with #ifdef MACRO_NAME ...#else ... #endif and require that the Fortran file end in F90 rather than f90 or that the command line includes the -fpp option | ||
Directives | |||
Offload next statement |
| #pragma offload target(mic[:n])<opt_offload_clauses> where <statement> is any valid C++ statement including compound statements, for example - if statement, for statement, or simple block statement such as {s1;s2;s3;…} | ret_val= _Cilk_offload function_name(args) ret_val=_Cilk_offload_to n function_name(vars) ret_val= ret_val= |
Offload enclosed block of code | !dir$ offload begin target
!dir$ end offload | See note above about compound statements | |
Offload OpenMP parallel section (or cilk_for construct) | !dir$ [omp] offload target(mic[:n])<opt_offload_clause> !$omp<parallel_directive> <statements> !$omp<end_directive> | #pragma offload target(mic[:n])<opt_offload_clauses> #pragma omp<parallel_directive> <compound_statement> | ret_val= ret_val = |
Start asynchronous data transfer to Coprocessor | !dir$ offload_transfer<in_offload_clauses>signal(signal_var) | #pragma offload_transfer<in_offload_clauses> signal(&signal_var) | |
Complete asynchronous data transfer from Coprocessor | !dir$ offload_transfer wait(signal_var)<out_offload_clauses> | #pragma offload_transfer wait(&signal_var) <out_offload_clauses> | |
Offload wait | !dir$ offload_wait(signal_var) | #pragma offload_wait(&signal_var) | |
Mark a function or subroutine as needing both a host and Coprocessor version | !dir$ attributes offload:mic ::routine_name | __attribute__ ((target(mic))) function_declaration __declspec(target(mic) | function_typeC_Cilk_offloadfunction_declaration |
Mark a global variable as needing to be allocated memory on both the host and Coprocessor | !dir$ attributes offload:mic ::var_name | __attribute__ ((target(mic)))variable_declaration __declspec (target(mic))variable_declaration | _Cilk_sharedvariable_declaration |
Mark everything in the enclosed region as needing both host and Coprocessor versions | #pragma offload_attribute (push,target(mic)) #pragma offload_attribute(pop) | #pragma offload_attribute #pragma offload_attribute | |
Allocate memory in the shared memory areas for host and Coprocessor | ptr= ptr = _Offload_shared_free(ptr) _Offload_shared_aligned_free | ||
Offload clauses used in directives | |||
| if(condition) where condition evaluates to .true. or .false. | if(condition) where condition evaluates to 0 or 1 | |
| signal(signal_var) | signal(&signal_var) | |
| wait(var) | wait(&var) | |
identical in Fortran and C++ | in(var_list[:modifiers]) | in(var_list[:modifiers]) | |
out(var_list[:modifiers]) | out(var_list[:modifiers]) | ||
inout(var_list[:modifiers]) | inout(var_list[:modifiers]) | ||
nocopy(var_list[:modifiers]) | nocopy(var_list[:modifiers]) | ||
Modifiers that can be used with in, out, inout and nocopy clauses | |||
length(num_elem) | length(num_elem) | ||
alloc_if(condition) where condition evaluates to .true. or .false. | alloc_if(condition) where condition evaluates to 1 or 0 | ||
free_if(condition) where condition evaluates to .true. or .false. | free_if(condition) where condition evaluates to 1 or 0 | ||
align(n) | align(n) | ||
alloc([first_index:last_index]) | alloc([first_index:element_count]) | ||
into(var_name) | into(var_name) |