summaryrefslogtreecommitdiff
path: root/debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h
diff options
context:
space:
mode:
Diffstat (limited to 'debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h')
-rw-r--r--debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h b/debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h
new file mode 100644
index 0000000..9ac685b
--- /dev/null
+++ b/debug_tools/WatchYourStep/ptxjitplus/inc/nvrtc_helper.h
@@ -0,0 +1,99 @@
+#if !defined(__NVRTC_HELPER__)
+
+#define __NVRTC_HELPER__ 1
+
+#include <cuda.h>
+#include <nvrtc.h>
+#include <sstream>
+#include <iostream>
+#include <fstream>
+#include <helper_cuda_drvapi.h>
+
+#define NVRTC_SAFE_CALL(Name, x) \
+ do { \
+ nvrtcResult result = x; \
+ if (result != NVRTC_SUCCESS) { \
+ std::cerr << "\nerror: " << Name << " failed with error " << \
+ nvrtcGetErrorString(result); \
+ exit(1); \
+ } \
+ } while(0)
+
+void compileFileToPTX(char *filename, int argc, const char **argv,
+ char **ptxResult, size_t *ptxResultSize)
+{
+ std::ifstream inputFile(filename, std::ios::in | std::ios::binary |
+ std::ios::ate);
+
+ if (!inputFile.is_open())
+ {
+ std::cerr << "\nerror: unable to open " << filename << " for reading!\n";
+ exit(1);
+ }
+
+ std::streampos pos = inputFile.tellg();
+ size_t inputSize = (size_t)pos;
+ char * memBlock = new char [inputSize + 1];
+
+ inputFile.seekg (0, std::ios::beg);
+ inputFile.read (memBlock, inputSize);
+ inputFile.close();
+ memBlock[inputSize] = '\x0';
+
+ // compile
+ nvrtcProgram prog;
+ NVRTC_SAFE_CALL("nvrtcCreateProgram", nvrtcCreateProgram(&prog, memBlock,
+ filename, 0, NULL, NULL));
+ nvrtcResult res = nvrtcCompileProgram(prog, argc, argv);
+
+ // dump log
+ size_t logSize;
+ NVRTC_SAFE_CALL("nvrtcGetProgramLogSize", nvrtcGetProgramLogSize(prog, &logSize));
+ char *log = (char *) malloc(sizeof(char) * logSize + 1);
+ NVRTC_SAFE_CALL("nvrtcGetProgramLog", nvrtcGetProgramLog(prog, log));
+ log[logSize] = '\x0';
+
+ /*
+ std::cerr << "\n compilation log ---\n";
+ std::cerr << log;
+ std::cerr << "\n end log ---\n";
+ */
+ free(log);
+
+ NVRTC_SAFE_CALL("nvrtcCompileProgram", res);
+ // fetch PTX
+ size_t ptxSize;
+ NVRTC_SAFE_CALL("nvrtcGetPTXSize", nvrtcGetPTXSize(prog, &ptxSize));
+ char *ptx = (char *) malloc(sizeof(char) * ptxSize);
+ NVRTC_SAFE_CALL("nvrtcGetPTX", nvrtcGetPTX(prog, ptx));
+ NVRTC_SAFE_CALL("nvrtcDestroyProgram", nvrtcDestroyProgram(&prog));
+ *ptxResult = ptx;
+ *ptxResultSize = ptxSize;
+}
+
+CUmodule loadPTX(char *ptx, int argc, char **argv)
+{
+ CUmodule module;
+ CUcontext context;
+ int major = 0, minor = 0;
+ char deviceName[256];
+
+ // Picks the best CUDA device available
+ CUdevice cuDevice = findCudaDeviceDRV(argc, (const char **)argv);
+
+ // get compute capabilities and the devicename
+ checkCudaErrors(cuDeviceComputeCapability(&major, &minor, cuDevice));
+ checkCudaErrors(cuDeviceGetName(deviceName, 256, cuDevice));
+ printf("> GPU Device has SM %d.%d compute capability\n", major, minor);
+
+ checkCudaErrors(cuInit(0));
+ checkCudaErrors(cuDeviceGet(&cuDevice, 0));
+ checkCudaErrors(cuCtxCreate(&context, 0, cuDevice));
+
+ checkCudaErrors(cuModuleLoadDataEx(&module, ptx, 0, 0, 0));
+
+ return module;
+}
+
+#endif
+