PyOpenCL с многопроцессорной обработкой INVALID_DEVICE - PullRequest
0 голосов
/ 06 февраля 2020

Мой вариант использования - это основной процесс, который компилирует кучу ядер 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.

...