Commit 071a0ad2f156ab492ebea6c5a60a1e49a62466de

Con Kolivas 2011-08-12T13:00:25

Preinitialise the devices only once on startup.

diff --git a/main.c b/main.c
index 3c28514..07458b8 100644
--- a/main.c
+++ b/main.c
@@ -4023,6 +4023,9 @@ int main (int argc, char *argv[])
 #ifdef HAVE_OPENCL
 	i = 0;
 
+	if (nDevs > 0)
+		preinit_devices();
+
 	/* start GPU mining threads */
 	for (j = 0; j < nDevs * opt_g_threads; j++) {
 		int gpu = j % nDevs;
diff --git a/ocl.c b/ocl.c
index 5fde373..873bfa4 100644
--- a/ocl.c
+++ b/ocl.c
@@ -52,6 +52,8 @@ char *file_contents(const char *filename, int *length)
 	return (char*)buffer;
 }
 
+static cl_uint numDevices;
+
 int clDevicesNum() {
 	cl_int status = 0;
 
@@ -111,6 +113,95 @@ int clDevicesNum() {
 	return numDevices;
 }
 
+static cl_platform_id platform = NULL;
+static cl_device_id *devices;
+
+int preinit_devices(void)
+{
+	cl_int status;
+	cl_uint numPlatforms;
+	int i;
+
+	status = clGetPlatformIDs(0, NULL, &numPlatforms);
+	if (status != CL_SUCCESS)
+	{
+		applog(LOG_ERR, "Error: Getting Platforms. (clGetPlatformsIDs)");
+		return -1;
+	}
+
+	if (numPlatforms > 0)
+	{
+		cl_platform_id* platforms = (cl_platform_id *)malloc(numPlatforms*sizeof(cl_platform_id));
+		status = clGetPlatformIDs(numPlatforms, platforms, NULL);
+		if (status != CL_SUCCESS)
+		{
+			applog(LOG_ERR, "Error: Getting Platform Ids. (clGetPlatformsIDs)");
+			return -1;
+		}
+
+		for(i = 0; i < numPlatforms; ++i)
+		{
+			char pbuff[100];
+			status = clGetPlatformInfo( platforms[i], CL_PLATFORM_VENDOR, sizeof(pbuff), pbuff, NULL);
+			if (status != CL_SUCCESS)
+			{
+				applog(LOG_ERR, "Error: Getting Platform Info. (clGetPlatformInfo)");
+				free(platforms);
+				return -1;
+			}
+			platform = platforms[i];
+			if (!strcmp(pbuff, "Advanced Micro Devices, Inc."))
+			{
+				break;
+			}
+		}
+		free(platforms);
+	}
+
+	if (platform == NULL) {
+		perror("NULL platform found!\n");
+		return -1;
+	}
+
+	status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
+	if (status != CL_SUCCESS)
+	{
+		applog(LOG_ERR, "Error: Getting Device IDs (num)");
+		return -1;
+	}
+
+	if (numDevices > 0 ) {
+		devices = (cl_device_id *)malloc(numDevices*sizeof(cl_device_id));
+
+		/* Now, get the device list data */
+
+		status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
+		if (status != CL_SUCCESS)
+		{
+			applog(LOG_ERR, "Error: Getting Device IDs (list)");
+			return -1;
+		}
+
+		applog(LOG_INFO, "List of devices:");
+
+		unsigned int i;
+		for(i=0; i<numDevices; i++) {
+			char pbuff[100];
+			status = clGetDeviceInfo(devices[i], CL_DEVICE_NAME, sizeof(pbuff), pbuff, NULL);
+			if (status != CL_SUCCESS)
+			{
+				applog(LOG_ERR, "Error: Getting Device Info");
+				return -1;
+			}
+
+			applog(LOG_INFO, "\t%i\t%s", i, pbuff);
+		}
+
+	} else return -1;
+
+	return 0;
+}
+
 static int advance(char **area, unsigned *remaining, const char *marker)
 {
 	char *find = memmem(*area, *remaining, marker, strlen(marker));
@@ -176,7 +267,6 @@ void patch_opcodes(char *w, unsigned remaining)
 _clState *initCQ(_clState *clState, unsigned int gpu)
 {
 	cl_int status = 0;
-	cl_device_id *devices = clState->devices;
 
 	/* create a cl program executable for all the devices specified */
 	status = clBuildProgram(clState->program, 1, &devices[gpu], NULL, NULL, NULL);
@@ -226,115 +316,32 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize)
 {
 	int patchbfi = 0;
 	cl_int status = 0;
-	unsigned int i;
+	size_t nDevices;
 
 	_clState *clState = calloc(1, sizeof(_clState));
 
-	cl_uint numPlatforms;
-	cl_platform_id platform = NULL;
-	status = clGetPlatformIDs(0, NULL, &numPlatforms);
-	if (status != CL_SUCCESS)
-	{
-		applog(LOG_ERR, "Error: Getting Platforms. (clGetPlatformsIDs)");
-		return NULL;
-	}
-
-	if (numPlatforms > 0)
-	{
-		cl_platform_id* platforms = (cl_platform_id *)malloc(numPlatforms*sizeof(cl_platform_id));
-		status = clGetPlatformIDs(numPlatforms, platforms, NULL);
-		if (status != CL_SUCCESS)
-		{
-			applog(LOG_ERR, "Error: Getting Platform Ids. (clGetPlatformsIDs)");
-			return NULL;
-		}
-
-		for(i = 0; i < numPlatforms; ++i)
-		{
-			char pbuff[100];
-			status = clGetPlatformInfo( platforms[i], CL_PLATFORM_VENDOR, sizeof(pbuff), pbuff, NULL);
-			if (status != CL_SUCCESS)
-			{
-				applog(LOG_ERR, "Error: Getting Platform Info. (clGetPlatformInfo)");
-				free(platforms);
-				return NULL;
-			}
-			platform = platforms[i];
-			if (!strcmp(pbuff, "Advanced Micro Devices, Inc."))
-			{
-				break;
-			}
-		}
-		free(platforms);
-	}
-
-	if (platform == NULL) {
-		perror("NULL platform found!\n");
-		return NULL;
-	}
+	cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0 };
 
-	size_t nDevices;
-	cl_uint numDevices;
-	status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
+	clState->context = clCreateContextFromType(cps, CL_DEVICE_TYPE_GPU, NULL, NULL, &status);
 	if (status != CL_SUCCESS)
 	{
-		applog(LOG_ERR, "Error: Getting Device IDs (num)");
+		applog(LOG_ERR, "Error: Creating Context. (clCreateContextFromType)");
 		return NULL;
 	}
 
-	cl_device_id *devices;
-	if (numDevices > 0 ) {
-		devices = (cl_device_id *)malloc(numDevices*sizeof(cl_device_id));
-		clState->devices = devices;
-
-		/* Now, get the device list data */
-
-		status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
+	if (gpu < numDevices) {
+		char pbuff[100];
+		status = clGetDeviceInfo(devices[gpu], CL_DEVICE_NAME, sizeof(pbuff), pbuff, &nDevices);
 		if (status != CL_SUCCESS)
 		{
-			applog(LOG_ERR, "Error: Getting Device IDs (list)");
-			return NULL;
-		}
-
-		applog(LOG_INFO, "List of devices:");
-
-		unsigned int i;
-		for(i=0; i<numDevices; i++) {
-			char pbuff[100];
-			status = clGetDeviceInfo(devices[i], CL_DEVICE_NAME, sizeof(pbuff), pbuff, NULL);
-			if (status != CL_SUCCESS)
-			{
-				applog(LOG_ERR, "Error: Getting Device Info");
-				return NULL;
-			}
-
-			applog(LOG_INFO, "\t%i\t%s", i, pbuff);
-		}
-
-		if (gpu < numDevices) {
-			char pbuff[100];
-			status = clGetDeviceInfo(devices[gpu], CL_DEVICE_NAME, sizeof(pbuff), pbuff, &nDevices);
-			if (status != CL_SUCCESS)
-			{
-				applog(LOG_ERR, "Error: Getting Device Info");
-				return NULL;
-			}
-
-			applog(LOG_INFO, "Selected %i: %s", gpu, pbuff);
-			strncpy(name, pbuff, nameSize);
-		} else {
-			applog(LOG_ERR, "Invalid GPU %i", gpu);
+			applog(LOG_ERR, "Error: Getting Device Info");
 			return NULL;
 		}
 
-	} else return NULL;
-
-	cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0 };
-
-	clState->context = clCreateContextFromType(cps, CL_DEVICE_TYPE_GPU, NULL, NULL, &status);
-	if (status != CL_SUCCESS)
-	{
-		applog(LOG_ERR, "Error: Creating Context. (clCreateContextFromType)");
+		applog(LOG_INFO, "Selected %i: %s", gpu, pbuff);
+		strncpy(name, pbuff, nameSize);
+	} else {
+		applog(LOG_ERR, "Invalid GPU %i", gpu);
 		return NULL;
 	}
 
diff --git a/ocl.h b/ocl.h
index 0960a4c..a95f972 100644
--- a/ocl.h
+++ b/ocl.h
@@ -18,11 +18,11 @@ typedef struct {
 	cl_uint preferred_vwidth;
 	size_t max_work_size;
 	size_t work_size;
-	cl_device_id *devices;
 } _clState;
 
 extern char *file_contents(const char *filename, int *length);
 extern int clDevicesNum();
+extern int preinit_devices(void);
 extern _clState *initCQ(_clState *clState, unsigned int gpu);
 extern _clState *initCl(unsigned int gpu, char *name, size_t nameSize);
 #endif /* HAVE_OPENCL */