Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
externfunc.h
1#pragma once
2#include "tool/macro.h"
3#include "tool/platform.h"
4
5namespace tinker {
7void throwExceptionMissingFunction(const char* functionName, const char* file, int lineNum);
8}
9
10#if TINKER_GPULANG_OPENACC // mixed source code: openacc and cuda
11
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__
16
17#define TINKER_FCALL0(F, ...) F##_acc(__VA_ARGS__)
18
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__)
23
24#define TINKER_FCALL2_cpp0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
25
26#elif TINKER_GPULANG_CUDA // pure cuda
27
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__
32
33#define TINKER_FCALL0(F, ...) F##_cu(__VA_ARGS__)
34
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__)
38
39#define TINKER_FCALL2_cpp0_cu1__(F, ...) TINKER_FCALL0_NORMAL_(F, cu, __VA_ARGS__)
40
41#else // host
42
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__
47
48#define TINKER_FCALL0(F, ...) F##_acc(__VA_ARGS__)
49
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__)
53
54#define TINKER_FCALL2_cpp0_cu1__(F, ...)
55
56#endif // end
57
58#define TINKER_FEXTN1_cpp0__(R, F, ...)
59
60#define TINKER_FVOID2(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, FUNC, ...) TINKER_FEXTN2__(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, void, FUNC, __VA_ARGS__)
61
62#define TINKER_FEXTN2__(SH1, SH2, R, F, ...) \
63 TINKER_FEXTN1__(SH1, R, F, __VA_ARGS__); \
64 TINKER_FEXTN1__(SH2, R, F, __VA_ARGS__)
65
66#define TINKER_FEXTN1__(SH, R, F, ...) TINKER_FEXTN1_##SH##__(R, F, __VA_ARGS__)
67
68#define TINKER_FVOID1 TINKER_FVOID2
69#define TINKER_FCALL1 TINKER_FCALL2
70
71#define TINKER_FCALL2(SUFFIX_HAS_IMPL1, SUFFIX_HAS_IMPL2, FUNC, ...) TINKER_FCALL2_##SUFFIX_HAS_IMPL1##_##SUFFIX_HAS_IMPL2##__(FUNC, __VA_ARGS__)
72
73#define TINKER_FEXTN1_EMPTY__
74#define TINKER_FEXTN1_NORMAL_(R, F, S, ...) extern R F##_##S(__VA_ARGS__)
75
76#define TINKER_FCALL0_ERROR__(F, S) throwExceptionMissingFunction(#F "_" #S, __FILE__, __LINE__)
77#define TINKER_FCALL0_NORMAL_(F, S, ...) F##_##S(__VA_ARGS__)
void throwExceptionMissingFunction(const char *functionName, const char *file, int lineNum)
Definition: testrt.h:9