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:

  1. Den parameter index, so dass ich manuell zuordnen, die parameter in der angegebenen Reihenfolge in den kernel.
  2. Die host-variable selbst.
  3. 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.
  4. 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?

Schreibe einen Kommentar