OpenCL:clEnqueueNDRangeKernel上的随机CL_MEM_OBJECT_ALLOCATION_FAILURE

时间:2015-06-16 17:19:07

标签: opencl nvidia

我有5个内核,可以处理有限数量的数据。创建了多个cl_mem对象,其中一些仅在单个内核中使用,一些在内核之间共享。在排队第3个内核时,我不断获得CL_MEM_OBJECT_ALLOCATION_FAILURE。但是,当我减少数据时,在排入第4个内核时会出现错误(第3个内核排队工作正常)。任何clCreateBuffer调用都不会返回任何错误。我怀疑这是一个记忆问题。对于第一个(更大的)数据集,在第3个内核入队失败之前分配了大约42MB内存(全局内存)(cl_mem对象)。对于第二个(较小的)数据集,在第4个内核入队失败之前仅分配了1.48MB内存(全局内存)。我的设备功能查询产生的CL_DEVICE_MAX_MEM_ALLOC_SIZE为256MByte,CL_DEVICE_GLOBAL_MEM_SIZE为1024MByte。分配比这些值少得多。担心,它可能是内核代码中的一个问题,我注释掉了整个内核代码,除了参数,我仍然得到相同的结果。所以我完全迷失了解这个问题。设置为上下文的回调通知函数(在clCreateContext中)未提供任何其他详细信息。有没有办法获取有关哪些内存对象分配失败以及出于什么原因的详细信息?

提前致谢

运行OpenCL 1.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
 -----------------------------------------------------------

2 个答案:

答案 0 :(得分:1)

clCreateBuffer 不会在设备上创建缓冲区,因此在缓冲区创建类型中您不会收到错误。 当你调用 clEnqueueWriteBuffer 时会返回错误,但由于返回代码非常模糊,因此无法调试原因。 我建议您使用CodeXLgDEBugger

等单步执行您的应用程序

答案 1 :(得分:0)

我遇到了同样的问题。情况是我在循环中使用clEnqueueNDRangekernel,并且每次在clEnqueueNDRangekernel函数之前使用clCreateBuffer,但是我没有释放缓冲区,因此在很长一段时间后导致内存溢出。解析是使用clCreateBuffer离开循环并在循环中写入缓冲区。