Я попытался инициализировать ядро 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:
Это была проблема инициализации. Проблема решена, и методы, описанные выше, будут работать.