将数组传递给所有工作项都相同的内核

时间:2019-07-08 14:52:11

标签: c++ opencl

我有带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的新手,我们将不胜感激。

谢谢, 阿尼鲁德

1 个答案:

答案 0 :(得分:0)

经过一番思考,我意识到我不清楚如何将数组传递到内核的基础知识。由于数据是多维的,因此我通过操作两个单独的内核解决了该问题。此外,第二个问题取决于第一个问题的结果,因此,两个单独的内核完成了这项工作。这解决了问题。

谢谢。