So starten Sie benutzerdefinierte OpenCL-kernel in OpenCV (3.0.0) OCL?
Ich bin wahrscheinlich missbrauchen, OpenCV, indem Sie Sie als wrapper, um die offizielle OpenCL C++ - Bindungen, so dass ich starten kann meinen eigenen Kernel.
Jedoch OpenCV hat Klassen, wie Programm, ProgramSource, Kernel, Queue, etc. das scheint mir zu sagen, dass ich starten kann, meine eigene (auch nicht-Bild-Basis) Kernel mit OpenCV. Ich habe Probleme bei der Suche nach Dokumentation gibt es für diese Klassen, geschweige denn Beispiele. Also, ich nahm einen Stich an es so weit:
#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;
}
Hinweis, dass ich nicht auf meinen host-Variablen noch. Ich bin am stecken kernel->args(...)
. Es gibt 15 überlastungen und keiner von Ihnen angeben, in welcher Reihenfolge sollte ich geben Sie den folgenden, pro-argument:
- Den parameter index, so dass ich manuell zuordnen, die parameter in der angegebenen Reihenfolge in den kernel.
- Die host-variable selbst.
- Die host-Variablen-array-Größe - normalerweise sage ich so etwas wie
sizeof(int) * ARRAY_SIZE
, obwohl ich verwendet, um anzugeben, dass auf die clEnqueueWriteBuffer Funktion in plain OpenCL. - Gerät buffer memory access, zum Beispiel CL_MEM_READ_ONLY
Sieht es nicht aus, ich nenne enqueueWriteBufer(...), enqueueNDRangeKernel(...), oder enqueueReadBuffer (...), weil (vermute ich mal) die kernel->run() macht alles für mich unter die Haube. Ich gehe davon aus, dass die kernel->run() schreiben Sie die neuen Werte meiner output-parameter.
Ich nicht geben Sie einen Befehl queue, ein Gerät oder ein Kontext. Ich denke, dass es nur eine command-queue und ein Kontext, und das Standard - Gerät erstellt unter der Haube und zugänglich sind, aus diesen Klassen.
So wieder, wie ich die args-Funktion des Kernels?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl ich bin mir nicht 100% sicher, dass ich herausgefunden, einen Weg, dies zu tun.
Dieses Beispiel enthält Tipps, wie Sie pass/empfangen von Daten zu/von einem custom-kernel mittels cv::UMat, grundlegende Typen (z.B. int/float/uchar), und Image2D.
Unten ist ein "shift.cl" - Datei.
Dem Punkt ist die Verwendung von UMat. Wir erhalten 5 Parameter im kernel (*data_ptr, int step, int offset, int rows, int cols) mit KernelArg::ReadOnly(umat); 3 (*data_ptr, int step, int offset) mit KernelArg::ReadOnlyNoSize(umat); und nur 1 (*data_prt) mit KernelArg::PtrReadOnly(umat). Von dieser Regel ist das gleiche für WriteOnly und ReadWrite.
Den Schritt und offset sind erforderlich, wenn der Zugriff auf das Daten-array, da UMat kann nicht dichten matrix aufgrund der Speicher-Adresse-Ausrichtung.
cv::ocl::Image2D konstruiert werden können, die aus einer UMat-Instanz und kann direkt übergeben kernel.args(). Mit image2D_t und sampler_t, wir können profitieren von der GPU-hardware textur-Einheiten für linear-interpolation Abtastung (mit reellwertige pixel-Koordinaten).
Beachten Sie, dass die "-D xxx=yyy " build-option bietet text-Ersatz von xxx zu yyy in den kernel-code.
Finden Sie weitere codes in meinem post: http://qiita.com/tackson5/items/8dac6b083071d31baf00
error: parameter may not be qualified with an address space: __global const image2d_t src
Meine OCL-Gerät ist eine Intel-Iris-GPU. Irgendwelche Vorschläge?__global const image2d_t src
durchread_only image2d_t src
. Nicht sicher, ob es der richtige Weg, da bin ich angefangen zu lernen OpenCL.