使用CL_MEM_USE_HOST_PTR创建缓冲区时,CL_OUT_OF_HOST_MEMORY

时间:2019-02-11 01:57:34

标签: opencl

我以前使用opencl 1.2包装程序的迭代器方法分配缓冲区。但是出于性能原因,我尝试提供一个主机指针指向已分配的内存。但是,当以此指定缓冲区时,在clCreateBuffer调用中出现CL_OUT_OF_HOST_MEMORY错误。

以前,当我将内存分配为std :: vector并为缓冲区提供迭代器方法(例如,

)时,此代码有效
std::vector<int> mem;
mem.resize( 256*256*256, 0);
_d_currentmap= cl::Buffer(*_context,
            mem.begin(), mem.end(), false);

_d_currentmap已创建,不会引发任何错误。我实际上创建了两个相同大小的缓冲区。

this intel article之后,我正在尝试迁移到零拷贝范例,因为我正在部署与CPU共享内存的Intel HD图形。

首先,我初始化要共享的内存,_map1和_map2被初始化。:

int size = 256*256*256;
int* _map1 = (int*)aligned_alloc(4096, sizeof(int)*size);
int* _map2 = (int*)aligned_alloc(4096, sizeof(int)*size);
memset((void*)_map1, 0, size*sizeof(int));
memset((void*)_map2, 0, size*sizeof(int));

然后我想在这些对象之间交换:

int size = 256*256*256*sizeof(int);
int* currptr, newptr;
switch( newmapnumber)
{
case 1:
    memset(_map1, 0, size);
    newptr= _map1;
    currptr= _map2;
    break;
case 2:
    memset(_map2, 0, size);
    newptr =_map2;
    currptr =_map1;
    break;
}
_mapSeq++;

try{
    cl::CommandQueue queue(*_context, CL_QUEUE_PROFILING_ENABLE);
    _d_newmap = cl::Buffer(*_context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, size*sizeof(int),(void*) newptr);
    _d_currentmap = cl::Buffer(*_context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, size*sizeof(int), (void*)currptr);
    queue.finish();          
 }
 catch (cl::Error err) {
    std::cout << "Exception\n";
    std::cerr
     << "ERROR: "
     << err.what()
     << "("
     << err.err()
     << ")"
     << std::endl;
     exit(1);
 }

这将返回

Exception
ERROR: clCreateBuffer(-6)

这是cl.h中定义的CL_OUT_OF_HOST_MEMORY错误

1 个答案:

答案 0 :(得分:0)

好吧,没有人会得到这个,因为我没有添加关键信息。 int大小在两个块之间的值发生了变化。

如顶部代码块所示

   int size = 256*256*256;

但是,在底部的代码块中,我指定了一个局部变量大小(用于cl :: Buffer声明)为

   int size=256*256*256*sizeof(int);

因此,在缓冲区的声明中,我再次将大小乘以sizeof(int):

 _d_newmap = cl::Buffer(*_context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, size*sizeof(int),(void*) newptr);

导致缓冲区覆盖和其他一系列问题。