Tôi có thể lạm dụng OpenCV bằng cách sử dụng nó như là trình bao bọc cho các ràng buộc OpenCL C++ chính thức để tôi có thể khởi chạy hạt nhân của riêng mình. Tuy nhiên, OpenCV không có các lớp như Program, ProgramSource, Kernel, Queue, vv mà dường như cho tôi biết rằng tôi có thể khởi chạy các hạt nhân của riêng mình (ngay cả không dựa trên hình ảnh) với OpenCV. Tôi gặp khó khăn khi tìm tài liệu ở đó cho các lớp này, hãy để một mình ví dụ. Vì vậy, tôi đã đâm vào nó cho đến nay:Làm thế nào để khởi chạy hạt nhân OpenCL tùy chỉnh trong OpenCV (3.0.0) OCL?
#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;
}
Lưu ý rằng tôi chưa thiết lập biến chủ của mình. Tôi bị kẹt ở số kernel->args(...)
. Có 15 tình trạng quá tải và không có quá tải nào xác định thứ tự tôi nên chỉ định những thứ sau, cho mỗi đối số:
- Chỉ số tham số, vì vậy tôi khớp thủ công tham số theo thứ tự được đưa ra trong hạt nhân.
- Bản thân biến chủ.
- Kích thước mảng của biến chủ nhà - thường tôi nói điều gì đó như
sizeof(int) * ARRAY_SIZE
, mặc dù tôi đã sử dụng để chỉ định rằng trên hàm clEnqueueWriteBuffer trong đồng bằng OpenCL. - Device truy cập bộ nhớ đệm, ví dụ CL_MEM_READ_ONLY
Nó không giống như tôi gọi enqueueWriteBufer (...), enqueueNDRangeKernel (...), hoặc enqueueReadBuffer (...) vì (tôi đoán) kernel-> run() thực hiện tất cả điều đó cho tôi dưới mui xe. Tôi giả định rằng kernel-> run() sẽ ghi các giá trị mới vào tham số đầu ra của tôi.
Tôi không chỉ định hàng đợi lệnh, thiết bị hoặc ngữ cảnh. Tôi nghĩ rằng chỉ có một hàng đợi lệnh và một bối cảnh, và thiết bị mặc định - tất cả đều được tạo dưới nắp và có thể truy cập được từ các lớp này.
Vì vậy, một lần nữa, làm cách nào để sử dụng hàm args của hạt nhân?
Tôi không thể biên dịch hạt nhân OpenCL của bạn. Tham số 'error: có thể không đủ điều kiện với một không gian địa chỉ: __global const image2d_t src' Thiết bị OCL của tôi là một GPU Intel Iris. Bất kỳ đề xuất? – max0r
@ max0r Trong trường hợp của tôi, tôi giải quyết vấn đề bằng cách thay thế: '__global const image2d_t src' bởi' read_only image2d_t src'. Không chắc chắn nếu đó là cách chính xác như tôi bắt đầu học OpenCL. – Catree
@Catree Làm thế nào để bạn biết được đối số đầu vào nào chúng ta nên sử dụng? Bất kỳ tài liệu chính thức nào ở đây? thx trước –