لماذا أحصل على cl_mem_object_allocation_failure؟
-
18-09-2019 - |
سؤال
أنا أخصيص المخزن المؤقت CL_MEM على GPU والعمل عليه، والذي يعمل بشكل جيد حتى يتم تجاوز حجم معين. في هذه الحالة ينجح التخصيص نفسه، ولكن التنفيذ أو النسخ لا. أرغب في استخدام ذاكرة الجهاز لعملية أسرع حتى أخصص مثل:
buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);
الآن ما لا أفهمه هو الحد الأقصى للحجم. أنا نسخ حوالي 16 ميجابايت ولكن يجب أن تكون قادرة على استخدام حوالي 128 ميجابايت (انظر CL_DEVICE_MAX_MEM_ALLOC_SIZE
).
لماذا تختلف هذه الأرقام كثيرا؟
إليك بعض مقتطفات من Ocldevicequery:
CL_PLATFORM_NAME: NVIDIA
CL_PLATFORM_VERSION: OpenCL 1.0
OpenCL SDK Version: 4788711
CL_DEVICE_NAME: GeForce 8600 GTS
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
CL_DEVICE_ADDRESS_BITS: 32
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte
CL_DEVICE_GLOBAL_MEM_SIZE: 255 MByte
CL_DEVICE_LOCAL_MEM_TYPE: local
CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
المحلول
لن يقوم ClCreateBuffer بإنشاء مخزن مؤقت على الجهاز. هذا المنطقي، لأنه في وقت الإبداع لا يعرف السائق الجهاز الذي سيستخدم جهاز المخزن المؤقت (أذكر أن السياق يمكن أن يحتوي على أجهزة متعددة). سيتم إنشاء المخزن المؤقت على الجهاز الفعلي عند تنظيف الكتابة أو عند تشغيل kernel يأخذ المخزن المؤقت كمعلمة.
بالنسبة إلى الحد من 16 ميغابايت، هل تستخدم أحدث برنامج تشغيل (195.xx)؟ إذا كان الأمر كذلك يجب عليك الاتصال NVIDIA إما من خلال المنتديات أو مباشرة.
نصائح أخرى
لا تنس أي ذاكرة أخرى تحدثتها على الجهاز (وإذا كانت هذه هي أيضا بطاقة الرسومات الخاصة بك، فإن الذاكرة التي تستخدمها الشاشة الخاصة بك).
(هل هناك طريقة للحصول على الذاكرة الحالية المتاحة، أو أكبر جزء، أو somesuch؟)