Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCL:将两个字符串传递给内核,不返回任何内容_C++_Opencl - Fatal编程技术网

C++ OpenCL:将两个字符串传递给内核,不返回任何内容

C++ OpenCL:将两个字符串传递给内核,不返回任何内容,c++,opencl,C++,Opencl,我想将两个字符串传递给OpenCL内核,并直接从中打印文本 到目前为止,我有: int main(void) { Context(CL_DEVICE_TYPE_GPU); static const unsigned elements = 1000; vector<string> dataA; for (int i = 0; i < elements; i++) { dataA.push_back("a"); }

我想将两个字符串传递给OpenCL内核,并直接从中打印文本

到目前为止,我有:

int main(void) {
    Context(CL_DEVICE_TYPE_GPU);
    static const unsigned elements = 1000;

    vector<string> dataA;
    for (int i = 0; i < elements; i++) {
        dataA.push_back("a");
    }

    vector<string> dataB;
    for (int i = 0; i < elements; i++) {
        dataB.push_back("b");
    }

    Buffer a(begin(dataA), end(dataA), true, false);
    Buffer b(begin(dataB), end(dataB), true, false);

    Program addProg(R"d(
        kernel
        void add(string a, string b) {
            unsigned idx = get_global_id(0);
            c[idx] = 2.0;
        }
    )d", true);

    auto add = make_kernel<Buffer, Buffer>(addProg, "add");
    add(EnqueueArgs(elements), a, b);


    system("pause");
}
int main(无效){
上下文(CL\U设备\U类型\U GPU);
静态常量无符号元素=1000;
矢量数据a;
for(int i=0;i
此代码在运行时崩溃,无需解释


我如何调试它,是否可以从内核打印文本并在屏幕上显示

好的,听起来像是要将字符串数组/向量传递给内核,并让内核中的每个工作项处理不同的字符串。由于STL向量和字符串类在OpenCL内核中不起作用,所以不能真正使用它们,因此最简单的方法是使用扁平的C字符数组(所有字符串都在一个数组中)

我在下面修改了你的程序来实现这一点。基本上,我们在
charsPerString
变量中设置任何字符串所需的最大字符数(假设您知道这是什么)。然后,我们分配一个包含
elements*charsPerString
字符的数组,并像您所做的那样使用单个字符初始化字符串。第i个字符串从索引
i*charsPerString
开始。然后我们可以将其作为单个缓冲区传递给内核

然后,内核让每个工作项使用
printf
打印出它所传递的两个字符串中的第一个字符,并以与上面相同的方式计算其字符串的开头

<>我还添加了异常的典型C++错误检查方法,它将显示可能发生的OpenCL错误。我已经在自己的笔记本电脑上测试过了,它可以工作,打印出:

0 has characters a and b
1 has characters a and b
2 has characters a and b
3 has characters a and b
4 has characters a and b
(这是我们所期望的)

希望您能够将其扩展到您自己的用例中

#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <iostream>

using namespace cl;
using namespace std;

int main(void) {
  try {
    Context(CL_DEVICE_TYPE_GPU);
    static const unsigned elements = 1000;

    static const unsigned charsPerString = 16;

    char *dataA = new char[elements*charsPerString];
    for (int i = 0; i < elements; i++) {
      dataA[i*charsPerString] = 'a';
    }

    char *dataB = new char[elements*charsPerString];
    for (int i = 0; i < elements; i++) {
      dataB[i*charsPerString] = 'b';
    }

    Buffer a(dataA, dataA+elements*charsPerString, true, false);
    Buffer b(dataB, dataB+elements*charsPerString, true, false);

    Program addProg(R"d(
        constant unsigned charsPerString = 16;
        kernel
        void add(global char *a, global char *b) {
            unsigned idx = get_global_id(0);
            printf("%d has characters %c and %c\n",
                   idx, a[idx*charsPerString], b[idx*charsPerString]);
        }
    )d");

    try {
      addProg.build();
    }
    catch (Error err) {
      if (err.err() == CL_BUILD_PROGRAM_FAILURE) {
        cout << "OpenCL build failure:" << endl;
        cout << addProg.getBuildInfo<CL_PROGRAM_BUILD_LOG>(Device::getDefault());
      }
      throw err;
    }

    addProg.build();

    auto add = make_kernel<Buffer, Buffer>(addProg, "add");
    add(EnqueueArgs(elements), a, b);
    CommandQueue::getDefault().finish();

    delete[] dataA;
    delete[] dataB;
  }
  catch (Error err) {
    cerr << "ERROR: " << err.what() << " (" << err.err() << ")" << endl;
  }

  system("pause");
}
\define\u CL\u ENABLE\u异常
#包括
#包括
使用名称空间cl;
使用名称空间std;
内部主(空){
试一试{
上下文(CL\U设备\U类型\U GPU);
静态常量无符号元素=1000;
静态常量无符号charsPerString=16;
char*dataA=新的char[elements*charsPerString];
for(int i=0;i您使用的是OpenCL平台的CUT?您能显示内核代码吗?您是否尝试捕捉OpenCL C++绑定中抛出的异常来获得有用的错误消息?同意JPAST。此外,您的问题是:从CL向String打印数据的唯一可能的方法是使用扩展(例如:CllAMDdPrimTf)。我使用的是与AMD SDK捆绑在一起的OpenCL版本。内核在我链接的代码行上,从Program addPr开始…我不能得到任何异常,似乎它们没有被抛出或什么的,我只是得到这个窗口,该窗口明确显示正在抛出一个
cl::Error
异常,您应该能够捕获到。您的内核代码似乎引用了未定义的<代码> > >代码>变量。此外,我不相信字符串< /C>是一种有效的数据类型(虽然我从未使用过AMD的C++内核语言扩展)。您应该尝试使用
char*
。我知道字符串会有问题。但是,我认为我无法创建char*的向量,所以我会有问题,对吗?这太棒了,正是我所期望的。谢谢;)