【问题标题】:opencl program not giving correct outputopencl 程序没有给出正确的输出
【发布时间】:2012-09-07 19:32:11
【问题描述】:

以下 C++ 和 OpenCL 给出的“结果”为 3 而不是预期的 9 (3+6),我不知道为什么。我的意图只是通过使用数组索引并在两个不同的数组索引处添加数字来测试访问以给出“结果”。鉴于我是 C、C++ 和 OpenCL 的新手,这很可能是基本的东西。另外,我使用向量作为输入是有原因的——这是我需要在更大范围内做的事情的试运行。非常感谢。

C++:

    vector<long> v1;
    vector<long> v2;
    long result;

    v1.push_back(3);
    v1.push_back(4);

    v2.push_back(5);
    v2.push_back(6);

    long* a1 = &v1[0];
    long* a2 = &v2[0];

    cl::Buffer bufA(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, v1.size()*sizeof(long), a1);
    cl::Buffer bufB(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, v2.size()*sizeof(long), a2);
    cl::Buffer bufC(context, CL_MEM_READ_WRITE, sizeof(long));

    addKernel.setArg(0, bufA);
    addKernel.setArg(1, bufB);
    addKernel.setArg(2, bufC);

    cl::CommandQueue queue(context, devices[0]);

    queue.enqueueTask(addKernel);

    queue.enqueueReadBuffer(bufC, CL_TRUE, 0, sizeof(long), &result);
    queue.flush();
    queue.finish();

    cout << "Result: " << result << endl;

OpenCL:

__kernel void useHostPtr(__global long *a, __global long *b, __global long *c) {
    *c = a[0] + b[1];
}

【问题讨论】:

    标签: c++ opencl


    【解决方案1】:

    主机端的long 类型可能有不同的长度。它通常是 4 个字节。在 OpenCL 中,long 定义为 64 位整数。 您应该在主机代码中使用cl_long 而不是long

    【讨论】:

    • 埃里克谢谢你。将所有长类型(向量和标量)更改为 cl_long 有效。但是在实际情况下,我可能有一个长或双 C++ 类型的数组或向量,我无法更改为 cl_types 并且我想在 opencl 中使用它们?
    • 添加我的最后一条评论:将 v1 和 v2 的声明更改为 long 但将所有其他部分保留为 cl_long 只会产生垃圾结果。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2016-07-22
    • 2022-06-10
    相关资源
    最近更新 更多