OpenCL:ClenqueEndRangeKernel上的随机CL_MEM_OBJECT_分配_失败

OpenCL:ClenqueEndRangeKernel上的随机CL_MEM_OBJECT_分配_失败,opencl,nvidia,Opencl,Nvidia,我有5个内核,可以处理有限数量的数据。创建了多个cl_mem对象,其中一些仅在单个内核中使用,另一些在内核之间共享。我在排队等待第三个内核时,不断收到CL_MEM_OBJECT_ALLOCATION_失败的消息。但是,当我减少数据量时,我会在第四个内核排队时收到错误(第三个内核排队工作正常)。在任何clCreateBuffer调用中都没有返回错误。我怀疑是内存问题。对于第一组(更大的)数据,在第三次内核排队失败之前,分配了将近42MB的内存(全局内存)(cl_mem objects)。对于第二组

我有5个内核,可以处理有限数量的数据。创建了多个cl_mem对象,其中一些仅在单个内核中使用,另一些在内核之间共享。我在排队等待第三个内核时,不断收到CL_MEM_OBJECT_ALLOCATION_失败的消息。但是,当我减少数据量时,我会在第四个内核排队时收到错误(第三个内核排队工作正常)。在任何clCreateBuffer调用中都没有返回错误。我怀疑是内存问题。对于第一组(更大的)数据,在第三次内核排队失败之前,分配了将近42MB的内存(全局内存)(cl_mem objects)。对于第二组(较小)数据,在第四次内核排队失败之前,只分配了1.48MB内存(全局内存)。My device Capabilities查询生成的CL_device_MAX_MEM_ALLOC_大小为256MB,CL_device_GLOBAL_MEM_大小为1024MB。我分配的比这些值少得多。担心这可能是内核代码中的一个问题,我注释掉了整个内核代码,除了参数,现在仍然得到相同的结果。所以我完全无法理解这个问题。设置为上下文(在clCreateContext中)的回调通知函数未提供任何其他详细信息。有没有办法获得关于哪个内存对象分配失败以及原因的详细信息

提前谢谢

运行OpenCL1.1 以下是设备详细信息:

-----------------------------------------------------------
Device Details
-----------------------------------------------------------
  CL_DEVICE_NAME:           GeForce GTX 460
  CL_DEVICE_VENDOR:             NVIDIA Corporation
  CL_DRIVER_VERSION:            340.62
  CL_DEVICE_VERSION:            OpenCL 1.1 CUDA
  CL_DEVICE_OPENCL_C_VERSION:           OpenCL C 1.1 
  CL_DEVICE_TYPE:           GPU
  CL_DEVICE_MAX_COMPUTE_UNITS:      7
  CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:       3
  CL_DEVICE_MAX_WORK_ITEM_SIZES:    1024 / 1024 / 64
  CL_DEVICE_MAX_WORK_GROUP_SIZE:    1024
  CL_DEVICE_MAX_CLOCK_FREQUENCY:    1350 MHz
  CL_DEVICE_ADDRESS_BITS:       32
  CL_DEVICE_MAX_MEM_ALLOC_SIZE:     256MByte
  CL_DEVICE_GLOBAL_MEM_SIZE:        1024MByte
  CL_DEVICE_ERROR_CORRECTION_SUPPORT:   no
  CL_DEVICE_LOCAL_MEM_TYPE:     local
  CL_DEVICE_LOCAL_MEM_SIZE:     47KByte
  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:   64KByte
  CL_DEVICE_QUEUE_PROPERTIES:       CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
  CL_DEVICE_QUEUE_PROPERTIES:       CL_QUEUE_PROFILING_ENABLE
  CL_DEVICE_IMAGE_SUPPORT:      1
  CL_DEVICE_MAX_READ_IMAGE_ARGS:    128
  CL_DEVICE_MAX_WRITE_IMAGE_ARGS:   8
 -----------------------------------------------------------
clCreateBuffer不会在设备上创建缓冲区,因此在缓冲区创建类型下不会出现错误。 调用clEnqueueWriteBuffer时将返回错误,但由于返回代码非常模糊,因此也无助于调试原因。
我建议您在应用程序中使用类似或

的内容,我遇到了相同的问题。情况是,我在循环中使用了ClenqueueEndRangeKernel,每次在使用ClenqueueEndRangeKernel函数之前都使用了clCreateBuffer,但我没有释放缓冲区,因此导致了长时间后的内存溢出。解决方法是在循环外使用clCreateBuffer,在循环内写入缓冲区。

可能是在排队读取或排队写入操作完成之前启动内核。当您减小缓冲区时,它们会很快完成,所以您的内核会及时运行。确保它们在两个单独的对象之间共享之前处于阻塞状态。对于所有排队读取和排队写入操作,我将阻塞标志设置为true。因此,它们本质上都只是在阻止呼叫。