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 | 30 +++++++++++++++++++++++++-----
2 files changed, 27 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 {
@@ -978,13 +978,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;
@@ -1003,6 +1005,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;
}
@@ -1012,8 +1022,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];
@@ -1041,13 +1051,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++)
{