Мой вариант использования - это основной процесс, который компилирует кучу ядер Open CL. Позже в программе несколько подпроцессов разветвляются и будут выполнять одно или несколько ядер. По какой-то причине в подпроцессах возникают ошибки устройства.
Я определил, что проблема не имеет отношения к компиляции, и воспроизвел ее с помощью следующего простого сценария:
import multiprocessing
import pyopencl as cl
def printme():
platforms = cl.get_platforms()
for p in platforms:
print 75*'!'
print p
print 75*':'
printme()
p = multiprocessing.Process(target = printme)
p.start()
p.join()
Кажется, что он связан с реализация NVIDIA OpenCL и не связанная с PyOpenCL, как я изначально думал. Та же проблема возникает в приведенном ниже примере.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <CL/cl.h>
#define CHECK(A) if ((status = A) != 0) { \
fprintf(stderr, "failed status %d at line %d\n", status, __LINE__); \
exit(1); \
}
static void
runit() {
int i;
cl_int status;
cl_platform_id *platforms;
cl_uint num_platforms;
cl_uint num_devices;
CHECK(clGetPlatformIDs(0, NULL, &num_platforms));
if (num_platforms == 0) {
fprintf(stderr, "no platforms\n");
exit(1);
}
platforms = malloc(sizeof(cl_platform_id)*num_platforms);
CHECK(clGetPlatformIDs(num_platforms, platforms, NULL));
CHECK(clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_ALL, 0, NULL,
&num_devices));
free(platforms);
}
int main(void) {
runit();
if (fork() == 0) {
runit();
}
else {
wait(NULL);
}
return 0;
}
Выход с ошибочным состоянием = -33 (недопустимое устройство). Кажется, что внутри реализации есть сохраненное состояние. Обратите внимание, что это выполняется из драйвера NVidia.