Probabilmente sto utilizzando in modo errato OpenCV utilizzandolo come wrapper per i binding OpenCL C++ ufficiali in modo che possa avviare i miei kernel personali.Come avviare il kernel OpenCL personalizzato in OpenCV (3.0.0) OCL?
Tuttavia, OpenCV ha classi come Program, ProgramSource, Kernel, Queue, ecc. Che sembrano dirmi che posso lanciare i miei kernel (anche non basati su immagini) con OpenCV. Ho difficoltà a trovare la documentazione là fuori per queste classi, per non parlare di esempi. Quindi, ho preso una pugnalata fino ad ora:
#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;
}
Nota che non ho ancora impostato le mie variabili host. Sono bloccato a kernel->args(...)
. Ci sono 15 sovraccarichi e nessuno di loro specificano che ordine dovrei specificare quanto segue, per ogni argomento:
- L'indice parametro, quindi abbino manualmente i parametri nell'ordine indicato nel kernel.
- La variabile host stessa.
- La dimensione dell'array della variabile host, in genere dico qualcosa come
sizeof(int) * ARRAY_SIZE
, anche se ero solito specificarlo nella funzione clEnqueueWriteBuffer in OpenCL. accesso alla memoria buffer di - dispositivo, ad esempio CL_MEM_READ_ONLY
E non sembra che io chiamo enqueueWriteBufer (...), enqueueNDRangeKernel (...), o enqueueReadBuffer (...) perché (suppongo) il kernel-> run() fa tutto questo per me sotto il cofano. Presumo che kernel-> run() scriverà i nuovi valori nel mio parametro di output.
Non ho specificato una coda comandi, dispositivo o contesto. Penso che ci sia solo una coda di comandi e un contesto, e il dispositivo predefinito - tutti creati sotto il cofano e accessibili da queste classi.
Quindi, ancora una volta, come utilizzare la funzione args del kernel?
non riesco a compilare il kernel OpenCL. 'errore: il parametro non può essere qualificato con uno spazio indirizzo: __global const image2d_t src' Il mio dispositivo OCL è una GPU Intel Iris. Eventuali suggerimenti? – max0r
@ max0r Nel mio caso, ho risolto il problema sostituendo: '__global const image2d_t src' di' read_only image2d_t src'. Non sono sicuro se è il modo corretto mentre sto iniziando a imparare OpenCL. – Catree
@Catree Come fai a sapere quale argomento di input dovremmo usare? Qualunque documento ufficiale qui? grazie anticipato –