1

我知道如何将结构从主机传递到代码,但问题是 push_back 函数(这是结构的内置函数)在 opencl 中不起作用。我的主机中有一个结构,例如

struct MyKey
{
   int x;
   float y;
   int scale;
   MyKey(int x, float y, int scale) : x(x), y(y), scale(scale){ }
}

我在主机中为这个结构创建了一个对象,比如

std :: vector<MyKey> obj;

我将它传递给我的内核,并将结构定义放在那里(在内核中),现在当我尝试调用 push_back 函数时,它会抛出错误。,

__kernel void test(ui32_t w, ui32_t h, constant struct MyKey* obj, i32_t thrd_size)
 {
         //toatl thread count is w*h
       i32_t i = get_global_id(0);
     if(i<thrd_size)
     {
          for (ui32_t i = 0; i < h; i++)
          {
               for (ui32_t j = 0; j < w; j++) 
                {
                    obj.push_back(MyKey(j,iw,h));
                }
          }
      }
  }

提前致谢..

4

2 回答 2

2

AMD 有一个静态 C++ 内核语言扩展,它支持一些 C++ 特性,例如类。

您可以在此处找到有关它的更多信息:http: //developer.amd.com/wordpress/media/2012/10/CPP_kernel_language.pdf

来自文档:内核代码:

Class Test
{
    setX (int value);
    private:
    int x;
}
__kernel foo (__global Test* InClass, ...)
{
    If (get_global_id(0) == 0)
    InClass->setX(5);
}

主机代码:

Class Test
{
    setX (int value);
    private:
    int x;
}
MyFunc ()
{
    tempClass = new(Test);
    ... // Some OpenCL startup code – create context, queue, etc.
    cl_mem classObj = clCreateBuffer(context, CL_USE_HOST_PTR,
    sizeof(Test),&tempClass, event);
    clEnqueueMapBuffer(...,classObj,...);
    tempClass.setX(10);
    clEnqueueUnmapBuffer(...,classObj,...); //class is passed to the Device
    clEnqueueNDRange(..., fooKernel, ...);
    clEnqueueMapBuffer(...,classObj,...); //class is passed back to the Host
}
于 2013-01-18T10:34:34.027 回答
2

OpenCL 的内核语言基于 C99,因此不可能有任何 C++ 特性。

此外,您的代码在概念层面上是错误的:即使您声明objMyKey结构向量,obj内核代码中的参数仍然只是指向MyKey结构的指针。

于 2013-01-17T08:00:14.513 回答