Browse Source

opencl: Include OpenCL platform in kernel binary filenames

Luke Dashjr 13 years ago
parent
commit
16dacbcf1b
3 changed files with 51 additions and 2 deletions
  1. 5 2
      ocl.c
  2. 45 0
      util.c
  3. 1 0
      util.h

+ 5 - 2
ocl.c

@@ -551,9 +551,9 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize)
 	/* Create binary filename based on parameters passed to opencl
 	 * compiler to ensure we only load a binary that matches what would
 	 * have otherwise created. The filename is:
-	 * name + kernelname +/- g(offset) + v + vectors + w + work_size + l + sizeof(long) + .bin
+	 * kernelname + name +/- g(offset) + v + vectors + w + work_size + l + sizeof(long) + p + platform version + .bin
 	 * For scrypt the filename is:
-	 * name + kernelname + g + lg + lookup_gap + tc + thread_concurrency + w + work_size + l + sizeof(long) + .bin
+	 * kernelname + name + g + lg + lookup_gap + tc + thread_concurrency + w + work_size + l + sizeof(long) + p + platform version + .bin
 	 */
 	char binaryfilename[255];
 	char filename[255];
@@ -726,6 +726,9 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize)
 	strcat(binaryfilename, numbuf);
 	sprintf(numbuf, "l%d", (int)sizeof(long));
 	strcat(binaryfilename, numbuf);
+	strcat(binaryfilename, "p");
+	strcat(binaryfilename, vbuff);
+	sanestr(binaryfilename, binaryfilename);
 	strcat(binaryfilename, ".bin");
 
 	binaryfile = fopen(binaryfilename, "rb");

+ 45 - 0
util.c

@@ -1557,6 +1557,51 @@ void *realloc_strcat(char *ptr, char *s)
 	return ret;
 }
 
+static
+bool sanechars[] = {
+	false, false, false, false, false, false, false, false,
+	false, false, false, false, false, false, false, false,
+	false, false, false, false, false, false, false, false,
+	false, false, false, false, false, false, false, false,
+	false, false, false, false, false, false, false, false,
+	false, false, false, false, false, false, false, false,
+	true , true , true , true , true , true , true , true ,
+	true , true , false, false, false, false, false, false,
+	false, true , true , true , true , true , true , true ,
+	true , true , true , true , true , true , true , true ,
+	true , true , true , true , true , true , true , true ,
+	true , true , true , false, false, false, false, false,
+	false, true , true , true , true , true , true , true ,
+	true , true , true , true , true , true , true , true ,
+	true , true , true , true , true , true , true , true ,
+	true , true , true , false, false, false, false, false,
+};
+
+char *sanestr(char *o, char *s)
+{
+	char *rv = o;
+	bool br = false;
+	
+	for ( ; s[0]; ++s)
+	{
+		if (sanechars[s[0] & 0x7f])
+		{
+			if (br)
+			{
+				br = false;
+				if (s[0] >= '0' && s[0] <= '9')
+					(o++)[0] = '_';
+			}
+			(o++)[0] = s[0];
+		}
+		else
+		if (o != s && o[-1] >= '0' && o[-1] <= '9')
+			br = true;
+	}
+	o[0] = '\0';
+	return rv;
+}
+
 void RenameThread(const char* name)
 {
 #if defined(PR_SET_NAME)

+ 1 - 0
util.h

@@ -67,6 +67,7 @@ bool initiate_stratum(struct pool *pool);
 void suspend_stratum(struct pool *pool);
 void dev_error(struct cgpu_info *dev, enum dev_reason reason);
 void *realloc_strcat(char *ptr, char *s);
+extern char *sanestr(char *o, char *s);
 void RenameThread(const char* name);
 
 extern void notifier_init(int pipefd[2]);