Handle GOMP_OPENACC_NVPTX_JIT=-ori in libgomp nvptx plugin
2017-06-26 Tom de Vries <tom@codesourcery.com>
* plugin/cuda/cuda.h (enum CUjit_option): Add CU_JIT_NEW_SM3X_OPT.
* plugin/plugin-nvptx.c (process_GOMP_OPENACC_NVPTX_JIT): Add
gomp_openacc_nvptx_ori parameter. Handle -ori.
(link_ptx): Add CU_JIT_NEW_SM3X_OPT to opts.
---
libgomp/plugin/cuda/cuda.h | 3 ++-
libgomp/plugin/plugin-nvptx.c | 34 +++++++++++++++++++++++++++++-----
2 files changed, 31 insertions(+), 6 deletions(-)
@@ -89,7 +89,8 @@ typedef enum {
CU_JIT_ERROR_LOG_BUFFER = 5,
CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES = 6,
CU_JIT_OPTIMIZATION_LEVEL = 7,
- CU_JIT_LOG_VERBOSE = 12
+ CU_JIT_LOG_VERBOSE = 12,
+ CU_JIT_NEW_SM3X_OPT = 15
} CUjit_option;
typedef enum {
@@ -143,6 +143,10 @@ init_cuda_lib (void)
#include "secure_getenv.h"
+#if CUDA_VERSION < 8000
+#define CU_JIT_NEW_SM3X_OPT 15
+#endif
+
/* Convenience macros for the frequently used CUDA library call and
error handling sequence as well as CUDA library calls that
do the error checking themselves or don't do it at all. */
@@ -980,13 +984,15 @@ debug_linkout (void *linkout, size_t linkoutsize)
}
static void
-process_GOMP_OPENACC_NVPTX_JIT (intptr_t *gomp_openacc_nvptx_o)
+process_GOMP_OPENACC_NVPTX_JIT (intptr_t *gomp_openacc_nvptx_o,
+ intptr_t *gomp_openacc_nvptx_ori)
{
const char *var_name = "GOMP_OPENACC_NVPTX_JIT";
const char *env_var = getenv (var_name);
notify_var (var_name, env_var);
*gomp_openacc_nvptx_o = 4;
+ *gomp_openacc_nvptx_ori = 0;
if (env_var == NULL)
return;
@@ -1005,6 +1011,14 @@ process_GOMP_OPENACC_NVPTX_JIT (intptr_t *gomp_openacc_nvptx_o)
continue;
}
+ if (c[0] == '-' && c[1] == 'o' && c[2] == 'r' && c[3] == 'i'
+ && (c[4] == '\0' || c[4] == ' '))
+ {
+ *gomp_openacc_nvptx_ori = 1;
+ c += 4;
+ continue;
+ }
+
GOMP_PLUGIN_error ("Error parsing %s", var_name);
break;
}
@@ -1014,8 +1028,8 @@ static bool
link_ptx (CUmodule *module, const struct targ_ptx_obj *ptx_objs,
unsigned num_objs)
{
- CUjit_option opts[7];
- void *optvals[7];
+ CUjit_option opts[8];
+ void *optvals[8];
float elapsed = 0.0;
char elog[1024];
char ilog[16384];
@@ -1043,13 +1057,23 @@ link_ptx (CUmodule *module, const struct targ_ptx_obj *ptx_objs,
optvals[5] = (void *) 1;
static intptr_t gomp_openacc_nvptx_o = -1;
+ static intptr_t gomp_openacc_nvptx_ori = -1;
if (gomp_openacc_nvptx_o == -1)
- process_GOMP_OPENACC_NVPTX_JIT (&gomp_openacc_nvptx_o);
+ process_GOMP_OPENACC_NVPTX_JIT (&gomp_openacc_nvptx_o,
+ &gomp_openacc_nvptx_ori);
opts[6] = CU_JIT_OPTIMIZATION_LEVEL;
optvals[6] = (void *) gomp_openacc_nvptx_o;
- CUDA_CALL (cuLinkCreate, 7, opts, optvals, &linkstate);
+ int nopts = 7;
+ if (gomp_openacc_nvptx_ori)
+ {
+ opts[nopts] = CU_JIT_NEW_SM3X_OPT;
+ optvals[nopts] = (void *) gomp_openacc_nvptx_ori;
+ nopts++;
+ }
+
+ CUDA_CALL (cuLinkCreate, nopts, opts, optvals, &linkstate);
for (; num_objs--; ptx_objs++)
{