我以前使用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错误
答案 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);
导致缓冲区覆盖和其他一系列问题。