Установка сходства потоков перед созданием контекста OpenCL приводит к Segfault - PullRequest
1 голос
/ 09 июля 2019

Я устанавливаю привязку основного потока к ядру 0, но создание контекста OpenCl заканчивается с ошибкой. (Я присоединился к фрагменту кода, чтобы воспроизвести проблему, я удалил проверку размера вектора, чтобы сделать ее максимально краткой).

Если я определяю более одного ядра в моем процессоре, все работает нормально.

У меня есть чувство, что я могу ошибаться. Но я бы предпочел конкретное объяснение.

И тогда ошибка может быть приятнее, чем грубая ошибка.

Открыть информацию CL:

  • Версия устройства Intel OpenCL 1.2 (сборка 475)
  • Версия драйвера 1.2.0.475
#include <vector>

#include <CL/cl.hpp>


int main(int argc, char** argv)
{
    // Set affinity to core 0
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(0, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);

    // Retrieve first platform
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);
    cl::Platform platform = platforms[0];

    // Retrieve first CPU device
    std::vector<cl::Device> devices;
    platform.getDevices(CL_DEVICE_TYPE_CPU, &devices);
    cl::Device device = devices[0];

    // Create context
    cl::Context ctx(device);

    return 0;
}

Редактировать: добавить версию OpenCL

1 Ответ

1 голос
/ 19 июля 2019

Я только что попробовал ваш пример с двумя Intel OpenCL SDK, но у вас не было точной версии под рукой. Оба работали без ошибок, поэтому: не может воспроизвести .

Этот кажется немного старше вашего (по номеру сборки):

CL_DEVICE_VERSION:          OpenCL 1.2 (Build 43)
CL_DRIVER_VERSION:          1.2.0.43
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 1.2 

Второй, я думаю, все еще самый последний драйвер процессора Intel:

CL_DEVICE_VERSION:          OpenCL 2.1 (Build 0)
CL_DRIVER_VERSION:          18.1.0.0920
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 2.0 

Я использовал GCC 7.4.0 в Ubuntu 18.4.

По моему опыту не проблема установить соответствие с Intel OpenCL Runtime для процессоров .

Я использовал его вместе с MPI на суперкомпьютерах, где у вас было бы несколько, например 4, процессы MPI для каждого вычислительного узла и затем для каждой среды выполнения process ' устанавливают маску ЦП для несвязанного подмножества доступных ядер. Среда выполнения Intel OpenCL (использующая встроенные блоки Intel Threading Building Blocks) внутри каждого процесса будет порождать по одному потоку на каждое назначенное ядро, то есть, как и ожидалось, придерживаться маски ЦП хост-процесса. Возможно, результат будет другим, если вы зададите сходство с первым потоком, а также зависит от того, где в заданной программе (относительно того, где среда выполнения OpenCL порождает его потоки).

Как вы, кажется, уже запустили свой код в отладчике и сузили его до clcreatecontext. Я бы посоветовал вам попробовать более новый драйвер OpenCL.

...