| /* Include Guard */ |
| #ifndef SHARED_KERNELS_H |
| #define SHARED_KERNELS_H |
| |
| /** |
| * Includes |
| */ |
| |
| #include <cuda_runtime.h> |
| |
| |
| /** |
| * Defines |
| */ |
| |
| /** |
| * When building a library, it is a good idea to expose as few as possible |
| * internal symbols (functions, objects, data structures). Not only does it |
| * prevent users from relying on private portions of the library that are |
| * subject to change without any notice, but it can have performance |
| * advantages: |
| * |
| * - It can make shared libraries link faster at dynamic-load time. |
| * - It can make internal function calls faster by bypassing the PLT. |
| * |
| * Thus, the compilation should by default hide all symbols, while the API |
| * headers will explicitly mark public the few symbols the users are permitted |
| * to use with a PUBLIC tag. We also define a HIDDEN tag, since it may be |
| * required to explicitly tag certain C++ types as visible in order for |
| * exceptions to function correctly. |
| * |
| * Additional complexity comes from non-POSIX-compliant systems, which |
| * artificially impose a requirement on knowing whether we are building or |
| * using a DLL. |
| * |
| * The above commentary and below code is inspired from |
| * 'https://gcc.gnu.org/wiki/Visibility' |
| */ |
| |
| #if defined(_WIN32) || defined(__CYGWIN__) |
| # define TAG_ATTRIBUTE_EXPORT __declspec(dllexport) |
| # define TAG_ATTRIBUTE_IMPORT __declspec(dllimport) |
| # define TAG_ATTRIBUTE_HIDDEN |
| #elif __GNUC__ >= 4 |
| # define TAG_ATTRIBUTE_EXPORT __attribute__((visibility("default"))) |
| # define TAG_ATTRIBUTE_IMPORT __attribute__((visibility("default"))) |
| # define TAG_ATTRIBUTE_HIDDEN __attribute__((visibility("hidden"))) |
| #else |
| # define TAG_ATTRIBUTE_EXPORT |
| # define TAG_ATTRIBUTE_IMPORT |
| # define TAG_ATTRIBUTE_HIDDEN |
| #endif |
| |
| #if TAG_IS_SHARED |
| # if TAG_IS_BUILDING |
| # define TAG_PUBLIC TAG_ATTRIBUTE_EXPORT |
| # else |
| # define TAG_PUBLIC TAG_ATTRIBUTE_IMPORT |
| # endif |
| # define TAG_HIDDEN TAG_ATTRIBUTE_HIDDEN |
| #else |
| # define TAG_PUBLIC |
| # define TAG_HIDDEN |
| #endif |
| #define TAG_STATIC static |
| |
| |
| |
| |
| /* Extern "C" Guard */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| |
| |
| /* Function Prototypes */ |
| TAG_PUBLIC int run_tests(void); |
| |
| |
| |
| /* End Extern "C" and Include Guard */ |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |