2 * Author......: Jens Steube <jens.steube@gmail.com>
12 #include <sys/types.h>
16 #define CL_PLATFORMS_MAX 128
17 #define CL_DEVICES_MAX 128
19 //char options[] = "–x spir -spir-std=1.2 -I.";
20 char options
[] = "-I. -x clc++ -cl-std=CL1.2";
22 static void checkErr (char *func
, cl_int err
)
24 if (err
!= CL_SUCCESS
)
26 fprintf (stderr
, "%s(): ", func
);
30 case CL_BUILD_PROGRAM_FAILURE
:
31 fprintf (stderr
, "CL_BUILD_PROGRAM_FAILURE");
34 case CL_COMPILER_NOT_AVAILABLE
:
35 fprintf (stderr
, "CL_COMPILER_NOT_AVAILABLE");
38 case CL_DEVICE_NOT_AVAILABLE
:
39 fprintf (stderr
, "CL_DEVICE_NOT_AVAILABLE");
42 case CL_DEVICE_NOT_FOUND
:
43 fprintf (stderr
, "CL_DEVICE_NOT_FOUND");
46 case CL_INVALID_BINARY
:
47 fprintf (stderr
, "CL_INVALID_BINARY");
50 case CL_INVALID_BUILD_OPTIONS
:
51 fprintf (stderr
, "CL_INVALID_BUILD_OPTIONS");
54 case CL_INVALID_CONTEXT
:
55 fprintf (stderr
, "CL_INVALID_CONTEXT");
58 case CL_INVALID_DEVICE
:
59 fprintf (stderr
, "CL_INVALID_DEVICE");
62 case CL_INVALID_DEVICE_TYPE
:
63 fprintf (stderr
, "CL_INVALID_DEVICE_TYPE");
66 case CL_INVALID_OPERATION
:
67 fprintf (stderr
, "CL_INVALID_OPERATION");
70 case CL_INVALID_PLATFORM
:
71 fprintf (stderr
, "CL_INVALID_PLATFORM");
74 case CL_INVALID_PROGRAM
:
75 fprintf (stderr
, "CL_INVALID_PROGRAM");
78 case CL_INVALID_VALUE
:
79 fprintf (stderr
, "CL_INVALID_VALUE");
82 case CL_OUT_OF_HOST_MEMORY
:
83 fprintf (stderr
, "CL_OUT_OF_HOST_MEMORY");
87 fprintf (stderr
, "Unknown error code: %d", err
);
91 fprintf (stderr
, "\n");
97 static char *load_kernel (const char *kernel_file
)
101 if ((fp
= fopen (kernel_file
, "rb")) != NULL
)
105 if (stat (kernel_file
, &st
) == -1)
107 fprintf (stderr
, "! stat() failed (%d) : %s\n", errno
, strerror (errno
));
110 char *buf
= (char *) malloc (st
.st_size
+ 1);
112 memset (buf
, 0, st
.st_size
+ 1);
114 size_t num_read
= fread (buf
, sizeof (char), st
.st_size
, fp
);
116 if (num_read
!= (size_t) st
.st_size
)
118 fprintf (stderr
, "! fread() [%s] failed (%d) : %s", kernel_file
, errno
, strerror (errno
));
129 fprintf (stderr
, "! fopen() [%s] failed (%d) : %s", kernel_file
, errno
, strerror (errno
));
136 static int writeProgramBins (char *dst
, unsigned char *binary
, size_t binary_size
)
138 FILE *fp
= fopen (dst
, "wb");
142 fprintf(stderr
, "! fopen() [%s] failed (%d) : %s\n", dst
, errno
, strerror (errno
));
146 if (fwrite (binary
, sizeof (unsigned char), binary_size
, fp
) != binary_size
)
148 fprintf(stderr
, "! fwrite() [%s] failed (%d) : %s\n", dst
, errno
, strerror (errno
));
158 int main (int argc
, char *argv
[])
162 fprintf (stderr
, "> Usage: %s ccopts src dst\n", argv
[0]);
167 char *ccopts
= argv
[1];
171 char *programSrc
= load_kernel (src
);
173 if (programSrc
== NULL
)
175 fprintf (stderr
, "Unable to open %s. Exiting.\n", src
);
180 cl_device_id devices
[1];
183 cl_platform_id platform
;
188 err
= clGetPlatformIDs(1, &platform
, &platforms
);
190 checkErr ((char *) "clGetPlatformIDs", err
);
192 err
= clGetDeviceIDs (platform
, CL_DEVICE_TYPE_GPU
, 1, devices
, &nDevices
);
194 checkErr ((char *) "clGetDeviceIDs", err
);
196 cl_context context
= clCreateContext (NULL
, 1, devices
, NULL
, NULL
, &err
);
198 checkErr ((char *) "clCreateContext", err
);
200 cl_program program
= clCreateProgramWithSource (context
, 1, (const char **) &programSrc
, NULL
, &err
);
202 checkErr ((char *) "clCreateProgramWithSource", err
);
204 size_t opt_len
= strlen (ccopts
) + 1 + strlen (options
) + 1;
206 char *options2
= (char *) malloc (opt_len
+ 1);
208 memset (options2
, 0, opt_len
+ 1);
210 snprintf (options2
, opt_len
, "%s %s", options
, ccopts
);
212 err
= clCompileProgram (program
, 1, devices
, options2
, 0, NULL
, NULL
, NULL
, NULL
);
214 //checkErr ((char *) "clCompileProgram", err);
216 size_t ret_val_size
= 0;
218 err
= clGetProgramBuildInfo (program
, devices
[0], CL_PROGRAM_BUILD_LOG
, 0, NULL
, &ret_val_size
);
220 checkErr ((char *) "clGetProgramBuildInfo", err
);
222 if (ret_val_size
> 1)
224 char *build_log
= (char *) malloc (ret_val_size
+ 1);
226 memset (build_log
, 0, ret_val_size
+ 1);
228 err
= clGetProgramBuildInfo (program
, devices
[0], CL_PROGRAM_BUILD_LOG
, ret_val_size
, build_log
, NULL
);
230 checkErr ((char *) "clGetProgramBuildInfo", err
);
237 err
= clGetProgramInfo (program
, CL_PROGRAM_BINARY_SIZES
, sizeof (size_t), &binary_size
, NULL
);
239 checkErr ((char *) "clGetProgramInfo", err
);
241 unsigned char *binary
= (unsigned char *) malloc (binary_size
);
243 memset(binary
, 0, binary_size
);
245 err
= clGetProgramInfo (program
, CL_PROGRAM_BINARIES
, sizeof (binary
), &binary
, NULL
);
247 checkErr ((char *) "clGetProgramInfo", err
);
249 err
= writeProgramBins (dst
, binary
, binary_size
);
251 checkErr ((char *) "writeProgramBins", err
);