Как исправить: Инициализация cl :: Kernel приводит к ошибке, что имя ядра возвращает пустую строку - PullRequest
0 голосов
/ 24 июня 2019

Я попытался инициализировать ядро ​​OpenCL с помощью cl :: Kernel. Для конструктора cl :: Kernel требуется cl :: Program (в следующей вызываемой программе) и const char [] (в следующем названии - имя ядра). Как уже упоминалось в заголовке, у меня проблема в том, что имя ядра всегда пустая строка.

Я попытался скопировать массив char строки std :: string, как показано в следующем коде.

Метод генерирования Programm :: Sources:

cl::Program::Sources* ScheduleManager::convertSources(std::string file) {
    cl::Program::Sources* sources = new cl::Program::Sources();

    ifstream sourceFile(file);
    string kernel_code(istreambuf_iterator<char>(sourceFile), (istreambuf_iterator<char>()));

    char* cstr = new char[kernel_code.length()+1];
    strcpy(cstr, kernel_code.c_str());

    sources->push_back({cstr,kernel_code.length()+1});
    cout<<"ScheduleManager::convertSources"<<sources->at(0).first<<endl;
    return sources;
}

Затем они устанавливаются в задании, и после этого подопечные будут загружаться со следующей функцией:

void Task::setProgramSources(cl::Program::Sources* sources) {
    std::cout<<"Task::setProgrammSources"<<sources->at(0).first<<std::endl;
    Sources=sources;
}

Тогда будет вызвана следующая функция:

void Device::generateProgramm(Task* task) {

    cl::Program program(OclContext, *task->getSources());
    cout <<"Sources"<< task->getSources()->at(0).first<<endl;
    if(program.build({OclDevice})!=CL_SUCCESS)
        cout << " Error building: " << program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(OclDevice) << "\n";
    else
        cout << "Success" <<endl;
    task->setProgam(program);
}

А теперь мы

cout << "Generate Programm for: " << device.getName() << endl;
device.generateProgramm(task);
char * cstr = new char[task->getKernelName().length() + 1];
strcpy(cstr, task->getKernelName().c_str());
cout << "Kernel Name: " << cstr << endl;
cl::Kernel kernel = cl::Kernel(task->getProgramm(), cstr,  &ErrorCode);
cout << "Error Code for generating Kernel: "<<ErrorCode <<" Kernel Name: "<<task->getKernelName()<<" - "<<kernel.getInfo<CL_KERNEL_FUNCTION_NAME>()<<endl;

Задача - это класс, в котором хранятся только данные. Данные не будут изменены.

Я даже пытался установить имя ядра следующим образом:

cl::Kernel kernel = cl::Kernel(task->getProgramm(), "xAxis",  &ErrorCode);

Текущий результат: Генерация программы для: процессора Intel® Core ™ (Intel® Core) TM i5-4210U с частотой 1,70 ГГц успех Имя ядра: xAxis Код ошибки для создания ядра: -46 имя ядра: xAxis -

Ожидаемый результат: Генерация программы для: процессора Intel® Core ™ (Intel® Core) TM i5-4210U с частотой 1,70 ГГц успех Имя ядра: xAxis Код ошибки для создания ядра: 0 Имя ядра: xAxis-xAxis

Обновление 1: Добавление отсутствующего кода для воспроизведения.

В настоящее время я проследил проблему до источников преобразования. Может быть, я только переписать это, так что ошибка будет исправлена.

Обновление 2: Это была проблема инициализации. Проблема решена, и методы, описанные выше, будут работать.

...