Browse Source

opencl: Add "goffset" setting to override detection of support for global work offsets

Luke Dashjr 11 years ago
parent
commit
5edb42d297
4 changed files with 34 additions and 1 deletions
  1. 16 0
      driver-opencl.c
  2. 1 0
      driver-opencl.h
  3. 16 1
      ocl.c
  4. 1 0
      util.c

+ 16 - 0
driver-opencl.c

@@ -304,6 +304,7 @@ void opencl_early_init()
 		struct opencl_device_data * const data = &dataarray[i];
 		struct opencl_device_data * const data = &dataarray[i];
 		*data = (struct opencl_device_data){
 		*data = (struct opencl_device_data){
 			.dynamic = true,
 			.dynamic = true,
+			.use_goffset = BTS_UNKNOWN,
 			.intensity = intensity_not_set,
 			.intensity = intensity_not_set,
 #ifdef USE_SCRYPT
 #ifdef USE_SCRYPT
 			.lookup_gap = 2,
 			.lookup_gap = 2,
@@ -451,6 +452,19 @@ const char *opencl_init_binary(struct cgpu_info * const proc, const char * const
 	return NULL;
 	return NULL;
 }
 }
 
 
+static
+const char *opencl_init_goffset(struct cgpu_info * const proc, const char * const optname, const char * const newvalue, char * const replybuf, enum bfg_set_device_replytype * const out_success)
+{
+	struct opencl_device_data * const data = proc->device_data;
+	char *end;
+	bool nv = bfg_strtobool(newvalue, &end, 0);
+	if (newvalue[0] && !end[0])
+		data->use_goffset = nv;
+	else
+		return "Invalid boolean value";
+	return NULL;
+}
+
 #ifdef HAVE_ADL
 #ifdef HAVE_ADL
 /* This function allows us to map an adl device to an opencl device for when
 /* This function allows us to map an adl device to an opencl device for when
  * simple enumeration has failed to match them. */
  * simple enumeration has failed to match them. */
@@ -1888,6 +1902,7 @@ static const struct bfg_set_device_definition opencl_set_device_funcs_probe[] =
 	{"vector", opencl_init_vector},
 	{"vector", opencl_init_vector},
 	{"work_size", opencl_init_worksize},
 	{"work_size", opencl_init_worksize},
 	{"binary", opencl_init_binary},
 	{"binary", opencl_init_binary},
+	{"goffset", opencl_init_goffset},
 #ifdef HAVE_ADL
 #ifdef HAVE_ADL
 	{"adl_mapping", opencl_init_gpu_map},
 	{"adl_mapping", opencl_init_gpu_map},
 	{"clock", opencl_init_gpu_engine},
 	{"clock", opencl_init_gpu_engine},
@@ -1913,6 +1928,7 @@ static const struct bfg_set_device_definition opencl_set_device_funcs[] = {
 	{"vector", opencl_cannot_set, ""},
 	{"vector", opencl_cannot_set, ""},
 	{"work_size", opencl_cannot_set, ""},
 	{"work_size", opencl_cannot_set, ""},
 	{"binary", opencl_cannot_set, ""},
 	{"binary", opencl_cannot_set, ""},
+	{"goffset", opencl_cannot_set, ""},
 #ifdef HAVE_ADL
 #ifdef HAVE_ADL
 	{"adl_mapping", opencl_cannot_set, "Map to ADL device"},
 	{"adl_mapping", opencl_cannot_set, "Map to ADL device"},
 	{"clock", opencl_set_gpu_engine, "GPU engine clock"},
 	{"clock", opencl_set_gpu_engine, "GPU engine clock"},

+ 1 - 0
driver-opencl.h

@@ -46,6 +46,7 @@ struct opencl_device_data {
 	char *_init_intensity;
 	char *_init_intensity;
 	bool dynamic;
 	bool dynamic;
 	
 	
+	enum bfg_tristate use_goffset;
 	cl_uint vwidth;
 	cl_uint vwidth;
 	size_t work_size;
 	size_t work_size;
 	cl_ulong max_alloc;
 	cl_ulong max_alloc;

+ 16 - 1
ocl.c

@@ -798,7 +798,22 @@ bool opencl_load_kernel(struct cgpu_info * const cgpu, _clState * const clState,
 				kernel_goffset_support = 2;
 				kernel_goffset_support = 2;
 				break;
 				break;
 		}
 		}
-		const bool device_goffset_support = (clState->hasOpenCL11plus && !clState->is_mesa);
+		bool device_goffset_support = false;
+		switch (data->use_goffset)
+		{
+			case BTS_TRUE:
+				device_goffset_support = true;
+				break;
+			case BTS_FALSE:
+				// if the kernel doesn't require goffset, allow the user to disable it
+				if (kernel_goffset_support != 2)
+					break;
+				// fallthru
+			case BTS_UNKNOWN:
+				if (clState->hasOpenCL11plus && !clState->is_mesa)
+					device_goffset_support = true;
+				break;
+		}
 		if (device_goffset_support)
 		if (device_goffset_support)
 		{
 		{
 			if (kernel_goffset_support)
 			if (kernel_goffset_support)

+ 1 - 0
util.c

@@ -2244,6 +2244,7 @@ bool bfg_strtobool(const char * const s, char ** const endptr, __maybe_unused co
 		
 		
 		{true , "enable"},
 		{true , "enable"},
 		{true , "always"},
 		{true , "always"},
+		{true , "force"},
 		{true , "true"},
 		{true , "true"},
 		{true , "yes"},
 		{true , "yes"},
 		{true , "on"},
 		{true , "on"},