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