Как добавить путь к включенной библиотеке в ядро?

Я нашел много примеров, как добавить это в хост на C, но синтаксис C++ отличается от C. Я хочу добавить внешнюю библиотеку в свой файл ядра.

Это часть моего кода:

std::ifstream sourceFile(name);
std::string sourceCode(
    std::istreambuf_iterator<char>(sourceFile),
    (std::istreambuf_iterator<char>()));
Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length() + 1));

// Make program of the source code in the context
Program program = Program(context, source);

// Build program for these specific devices


errcode = program.build(devices);
if (errcode != CL_SUCCESS)
{
    cout << "There were error during build kernel code. Please, check program code. Errcode = " << errcode << "\n";
    cout << "BUILD LOG: " + program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(devices[0]) + "\n";
    getchar();
    return;
}


// Make kernel
Kernel kernel(program, "vector_add");

Как добавить в этот код путь к внешней библиотеке?

На следующем этапе я думаю, что нужно добавить второй источник в Program :: Sources. Кто-нибудь это написал?

Вы говорите о компиляции и передаче библиотеки компоновщику? Или про библиотеки opencl?

hellow 24.09.2018 13:13

@hellow, извините, забыл добавить, что мне нужно включить библиотеку (.cl) в файл ядра. Для этого мне нужно добавить путь к библиотеке на хосте.

Fresto 24.09.2018 13:18

Если файл, который вы включаете в свой .cl, не является простым OpenCL C (или C++, где поддерживается), он не будет работать. Например, вы не можете использовать std :: map в ядре OpenCL.

Dithermaster 25.09.2018 06:56

@Dithermaster Я хочу добавить свою внешнюю библиотеку .cl. Подскажите, пожалуйста, как я могу это сделать в среде хоста? Как мне написать путь к библиотеке на хосте C++? Простой пример. Я показал часть своего кода выше.

Fresto 25.09.2018 09:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
315
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе Спецификация OpenCL 1.2 (то же самое для 2.0),

-I dir Add the directory dir to the list of directories to be searched for header files.

Вы не можете включать какой-либо ".cl" в другой ".cl", но вы можете использовать #include "Header.h" столько, сколько захотите, где у вас могут быть некоторые функции или #define и т. д.

Обратите внимание, что код в этом заголовке должен быть на OpenCL C, аналогичном вашему ядру (за исключением случаев, когда используется OpenCL 2.2, где вы можете использовать OpenCL C++).

И, наконец, за исключением случаев, когда вы используете OpenCL 2.0 и выше, вы не можете вызывать функцию ядра внутри ядра, поэтому они должны быть обычной функцией void foo().

Итак, в вашем случае вы можете сделать это:

Program program = Program(context, source);
errcode = program.build(devices, "-I C:\Path\To\My\Include\Header);

И чтобы ответить на ваш второй вопрос

In the next step i think, that need to add the second source in Program::Sources. Has anyone written this?

Вы можете вернуть sources.push_back({ kernelSource.c_str(), kernelSource.length() + 1 }); столько исходного кода ядра, сколько захотите, в один вектор sources, который вы предоставляете программе. Но в конце вы можете создать несколько ядер с помощью этой программы, поскольку вам нужно указать одно имя ядра для каждого cl :: Kernel, например:

Kernel kernel_add(program, "vector_add");
Kernel kernel_sub(program, "vector_sub");

Это означает, что kernel_add и kernel_sub собираются одновременно, но в конечном итоге это два разных ядра.

О чувак. Будьте здоровы! Решение моей задачи - 10 символов. Никто не мог дать такого ответа.

Fresto 25.09.2018 16:36

Другие вопросы по теме