3#include "tool/platform.h"
10#if TINKER_GPULANG_OPENACC
12#define TINKER_FEXTN1_acc1__(R, F, ...) TINKER_FEXTN1_NORMAL_(R, F, acc, __VA_ARGS__)
13#define TINKER_FEXTN1_acc0__(R, F, ...) TINKER_FEXTN1_EMPTY__
14#define TINKER_FEXTN1_cu1__(R, F, ...) TINKER_FEXTN1_NORMAL_(R, F, cu, __VA_ARGS__)
15#define TINKER_FEXTN1_cu0__(R, F, ...) TINKER_FEXTN1_EMPTY__
17#define TINKER_FCALL0(F, ...) F##_acc(__VA_ARGS__)
19#define TINKER_FCALL2_acc0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
20#define TINKER_FCALL2_acc1_cu0__(F, ...) TINKER_FCALL0_NORMAL_(F, acc, __VA_ARGS__)
21#define TINKER_FCALL2_acc1_cu1__(F, ...) \
22 (pltfm_config & Platform::CUDA) ? TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__) : TINKER_FCALL0_NORMAL_(F, acc, __VA_ARGS__)
24#define TINKER_FCALL2_cpp0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
26#elif TINKER_GPULANG_CUDA
28#define TINKER_FEXTN1_acc1__(R, F, ...) TINKER_FEXTN1_EMPTY__
29#define TINKER_FEXTN1_acc0__(R, F, ...) TINKER_FEXTN1_EMPTY__
30#define TINKER_FEXTN1_cu1__(R, F, ...) TINKER_FEXTN1_NORMAL_(R, F, cu, __VA_ARGS__)
31#define TINKER_FEXTN1_cu0__(R, F, ...) TINKER_FEXTN1_EMPTY__
33#define TINKER_FCALL0(F, ...) F##_cu(__VA_ARGS__)
35#define TINKER_FCALL2_acc0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
36#define TINKER_FCALL2_acc1_cu0__(F, ...) TINKER_FCALL0_ERROR__(F, cu)
37#define TINKER_FCALL2_acc1_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
39#define TINKER_FCALL2_cpp0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
43#define TINKER_FEXTN1_acc1__(R, F, ...) TINKER_FEXTN1_NORMAL_(R, F, acc, __VA_ARGS__)
44#define TINKER_FEXTN1_acc0__(R, F, ...) TINKER_FEXTN1_EMPTY__
45#define TINKER_FEXTN1_cu1__(R, F, ...) TINKER_FEXTN1_EMPTY__
46#define TINKER_FEXTN1_cu0__(R, F, ...) TINKER_FEXTN1_EMPTY__
48#define TINKER_FCALL0(F, ...) F##_acc(__VA_ARGS__)
50#define TINKER_FCALL2_acc0_cu1__(F, ...) TINKER_FCALL0_ERROR__(F, cu)
51#define TINKER_FCALL2_acc1_cu0__(F, ...) TINKER_FCALL0_NORMAL_(F, acc, __VA_ARGS__)
52#define TINKER_FCALL2_acc1_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, acc, __VA_ARGS__)
54#define TINKER_FCALL2_cpp0_cu1__(F, ...)
58#define TINKER_FEXTN1_cpp0__(R, F, ...)
60#define TINKER_FVOID2(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, FUNC, ...) TINKER_FEXTN2__(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, void, FUNC, __VA_ARGS__)
62#define TINKER_FEXTN2__(SH1, SH2, R, F, ...) \
63 TINKER_FEXTN1__(SH1, R, F, __VA_ARGS__); \
64 TINKER_FEXTN1__(SH2, R, F, __VA_ARGS__)
66#define TINKER_FEXTN1__(SH, R, F, ...) TINKER_FEXTN1_##SH##__(R, F, __VA_ARGS__)
68#define TINKER_FVOID1 TINKER_FVOID2
69#define TINKER_FCALL1 TINKER_FCALL2
71#define TINKER_FCALL2(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, FUNC, ...) TINKER_FCALL2_##SUFFIX_HAS_IMPL1##_##SUFFIX_HAS_IMPL2##__(FUNC, __VA_ARGS__)
73#define TINKER_FEXTN1_EMPTY__
74#define TINKER_FEXTN1_NORMAL_(R, F, S, ...) extern R F##_##S(__VA_ARGS__)
76#define TINKER_FCALL0_ERROR__(F, S) throwExceptionMissingFunction(#F "_" #S, __FILE__, __LINE__)
77#define TINKER_FCALL0_NORMAL_(F, S, ...) F##_##S(__VA_ARGS__)