Я, вероятно, неправильно использую OpenCV, используя его как оболочку для официальных ссылок OpenCL C++, чтобы я мог запускать свои собственные ядра.Как запустить пользовательское ядро OpenCL в OpenCV (3.0.0) OCL?
Однако в OpenCV есть классы, такие как Program, ProgramSource, Kernel, Queue и т. Д., Которые, похоже, говорят мне, что я могу запускать свои собственные (даже не имиджные) ядра с OpenCV. У меня возникли проблемы с поиском документации для этих классов, не говоря уже о примерах. Итак, я до сих пор на него наносил удар:
#include <fstream>
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"
#define ARRAY_SIZE 128
using namespace std;
using namespace cv;
int main(int, char)
{
std::ifstream file("kernels.cl");
std::string kcode(std::istreambuf_iterator<char>(file),
(std::istreambuf_iterator<char>()));
cv::ocl::ProgramSource * programSource;
programSource = new cv::ocl::ProgramSource(kcode.c_str());
cv::String errorMessage;
cv::ocl::Program * program;
program = new cv::ocl::Program(*programSource, NULL, errorMessage);
cv::ocl::Kernel * kernel;
kernel = new cv::ocl::Kernel("simple_add", *program);
/* I'm stuck here at the args. */
size_t globalSize[2] = { ARRAY_SIZE, 1 };
size_t localSize[2] = { ARRAY_SIZE, 1 };
kernel->run(ARRAY_SIZE, globalSize, localSize, true);
return 0;
}
Отметьте, что я еще не установил переменные хоста. Я застрял в kernel->args(...)
. Существует 15 перегрузок, и ни один из них не указывает, какой порядок я должен указать для аргумента:
- Индекс параметров, поэтому я вручную сопоставляю параметр в порядке, указанном в ядре.
- Сама переменная хоста.
- Размер массива переменной хоста - обычно я говорю что-то вроде
sizeof(int) * ARRAY_SIZE
, хотя я использовал, чтобы указать это в функции clEnqueueWriteBuffer в простом OpenCL. Доступ к памяти буфера - устройств, например CL_MEM_READ_ONLY
Это не выглядит, как я называю enqueueWriteBufer (...), enqueueNDRangeKernel (...), или enqueueReadBuffer (...), потому что (я думаю,) kernel-> run() делает все это для меня под капотом. Я предполагаю, что kernel-> run() будет записывать новые значения в мой выходной параметр.
Я не указывал очередь команд, устройство или контекст. Я думаю, что есть только одна командная очередь и один контекст, а устройство по умолчанию - все создано под капотом и доступно из этих классов.
Итак, как я могу использовать функцию args ядра?
Я не могу скомпилировать OpenCL ядра. 'error: параметр не может быть присвоен адресному пространству: __global const image2d_t src' Мое устройство OCL является графическим процессором Intel Iris. Какие-либо предложения? – max0r
@ max0r В моем случае я решил проблему, заменив: '__global const image2d_t src' на' read_only image2d_t src'. Не уверен, что это правильный способ, когда я начинаю изучать OpenCL. – Catree
@Catree Как узнать, какой входной аргумент мы должны использовать? Любой официальный документ здесь? thx заранее –