Opencl 从HD6790升级到HD7850后从cl::BufferGL返回的值错误

Opencl 从HD6790升级到HD7850后从cl::BufferGL返回的值错误,opencl,gpu,amd-processor,Opencl,Gpu,Amd Processor,我可以将数据写入GPU上的cl::BufferGL变量并使用它进行绘制,但在读回主机时得到了错误的值。我已经从AMDSDK运行了几个示例,包括GL_CL interop,一切正常。我可以读写cl::Buffer,即从主机复制到设备,从设备复制到主机 源代码位于 要创建cl::Buffer,我按顺序执行以下步骤,然后获取cl_gl上下文: glGenBuffer glBindBuffer glBufferData clCreateFromGLBuffer glBindBuffer绑定到0,或取消绑

我可以将数据写入GPU上的cl::BufferGL变量并使用它进行绘制,但在读回主机时得到了错误的值。我已经从AMDSDK运行了几个示例,包括GL_CL interop,一切正常。我可以读写cl::Buffer,即从主机复制到设备,从设备复制到主机

源代码位于

要创建cl::Buffer,我按顺序执行以下步骤,然后获取cl_gl上下文:

glGenBuffer glBindBuffer glBufferData clCreateFromGLBuffer glBindBuffer绑定到0,或取消绑定 该程序使用以下方法编写:

C++ Ubuntu 12.06 64位,内核3.2.0-29-generic OpenCL1.2 驱动程序1124.2来自AMD的二进制驱动程序,Catalyst 13.4 AMD APPSDK v2.8 OpenGL版本:4.2.12217 格洛 免费供应 编辑:我创建了一个代码块来重现错误

// Terminates OpenCL commands
cl_int status = 0;
status =  clFinish( (cq)() );
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__);  }

// Create Vertex buffer object
GLint  number = 5;
GLuint buffer;
CHk_ERR( glGenBuffers( 1, &buffer ));
CHk_ERR( glBindBuffer( GL_ARRAY_BUFFER, buffer ) );

// initialize buffer object
GLsizeiptr     size = static_cast<GLsizeiptr>(sizeof(number));
const GLvoid * data = static_cast<const GLvoid *>(&number);
CHk_ERR( glBufferData( GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW) );
CHk_ERR( glBindBuffer(GL_ARRAY_BUFFER, 0) );
glFinish();

if ( glGetError() != GL_NO_ERROR ) { printf("File: %s:%d\n", __FILE__, __LINE__);  }

// create OpenCL buffer from GL VBO
cl_mem mem = clCreateFromGLBuffer( (context)(), CL_MEM_READ_WRITE, buffer, &status );
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__);  }

// Acquire OpenCL memory objects that have been created from OpenGL objects
if ( clEnqueueAcquireGLObjects( (cq)(), 1, &(mem), 0, NULL, NULL ) != CL_SUCCESS ){
    std::cout << "ERROR!";
}

// Read buffer
GLint value;
cq.enqueueReadBuffer( mem, CL_TRUE, 0, size, &value );
std::cout << "Value: " << value << std::endl;

感谢您的帮助

在任何人能够帮助您之前,您必须发布一些有关应用程序的详细信息,可能还有一些主机/内核代码。谢谢您的回答。什么样的细节?我的程序非常大,面向对象,我想粘贴代码是个问题。没有代码细节很难猜。我的猜测是,根据OpenCL规范(可能是第9.7节),在clEnqueueReleaseGLObjects之后缺少clFinish,或者在clEnqueueAcquireGLObjects之前缺少glFinish,但这是来自memoryVery的,代码没有返回任何错误。我正在完成这个序列;clEnqueueAcquireGLObjects。。。;排队读取缓冲区。。。;我已经添加了一个git rep,其hole项目位于,如果可以,请查看。