我有带UHD 630内置图形卡的Intel i7-8700K处理器。我正在使用opencl 2.0 C ++扩展(cl2.hpp)。
我有一个内核字符串
std::string kernel1{
"kernel void frustumCheck(global float3 *contPoints, global const float3 *camPoints, global const float3 *camDirection, global bool *outMatG, float3 camParams, int numControl){"
" float3 worldUp = (float3)(0.0f, 1.0f, 0.0f);"
" int iterId = get_global_id(0);"
" float3 camRight = normalize(cross(camDirection[iterId], worldUp));"
" float3 camUp = normalize(cross(camRight, camDirection[iterId]));"
// Field of view parameter calculation
" float3 farCenter = camPoints[iterId] + camDirection[iterId]*camParams.z;"
" float3 far_tl = farCenter + camUp*camParams.y - camRight*camParams.x;"
" float3 far_bl = far_tl - camUp*2*camParams.y;"
" float3 far_br = far_bl + camRight*2*camParams.x;"
" float3 far_tr = far_br + camUp*2*camParams.y;"
" bool check = 0;"
" for(int i = 0; i < numControl; i++){"
//" printf(\" do processing here \");"
//" printf(\" can i access as contPoints[i] ? \");"
" }"
//"printf(\"Processed id %d \\n\\n\", iterId);"
"}"};
其中camPoints和camDirection是两个尺寸相同的输入数组。我想传递整个数组contPoints(dim = numControl),camPoints数组中的每个工作项都将使用整个contPoints数组(在for循环中)。我不明白如何传递此数组,以便整个数组可用于每个工作项。 outMatG是一个输出2D数组。
下面显示了向量和内核程序的初始化。
// SVM allocations for input variables
cl::SVMAllocator<int, cl::SVMTraitCoarse<>> svmAlloc;
qDebug() << "Max alloc size: " << svmAlloc.max_size() << " bytes\n";
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>> contPoints(svmAlloc);
contPoints.resize(numControl);
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>> camPoints(svmAlloc);
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>> camDirection(svmAlloc);
// SVM allocation for output matrix g
std::vector<std::vector<bool>, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>> outMatG(svmAlloc);
auto frustumCheckKernel =
cl::KernelFunctor<
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>>&,
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>>&,
std::vector<cl_float3, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>>&,
std::vector<std::vector<bool> , cl::SVMAllocator<int, cl::SVMTraitCoarse<>>>&,
cl_float3,
int
>(camProgram, "frustumCheck");
我称内核函数为
cl_int error;
frustumCheckKernel(
cl::EnqueueArgs(blockSize),
contPoints,
camPoints,
camDirection,
outMatG,
camParams,
numControl,
error
);
blockSize表示我在while循环内处理的1000个矢量元素的批次。
我在https://github.com/KhronosGroup/OpenCL-CLHPP/blob/master/examples/src/trivialCL2.cpp上遵循示例。这是正确的方法吗?我试图将其作为float3的std :: vector传递,但抛出错误,提示未指定数据类型。
我是opencl的新手,我们将不胜感激。
谢谢, 阿尼鲁德
答案 0 :(得分:0)
经过一番思考,我意识到我不清楚如何将数组传递到内核的基础知识。由于数据是多维的,因此我通过操作两个单独的内核解决了该问题。此外,第二个问题取决于第一个问题的结果,因此,两个单独的内核完成了这项工作。这解决了问题。
谢谢。