CLINFO(1) General Commands Manual CLINFO(1)

clinfo - نمایش پلتفرم‌ها و دستگاه‌های OpenCL

clinfo [گزینه‌ها ...]

clinfo تمام اطلاعات موجود درباره تمام پلتفرم‌های OpenCL موجود در سیستم و دستگاه‌هایی که ارائه می‌دهند را چاپ می‌کند.

clinfo گزینه‌های زیر را می‌پذیرد:

تلاش برای دریافت تمام ویژگی‌ها، حتی مواردی که به طور رسمی پشتیبانی نمی‌شوند (برای مثال به این دلیل که به افزونه‌های خاصی نیاز دارند)، اما فقط در صورتی نمایش داده می‌شوند که ویژگی با موفقیت دریافت شده باشد؛ همچنین بخش محدودیت‌ها (LIMITATIONS) در زیر را ببینید؛ توجه داشته باشید با وجود اینکه این کار ممکن است ویژگی‌های پنهان را آشکار کند، هیچ تضمینی وجود ندارد که مقادیر بازگردانده‌شده معنادار باشند یا قابلیت مربوطه در عمل اصلاً در دسترس باشد؛
مانند -a، اما خطاها را نیز نشان می‌دهد؛
تولید خروجی خوانا برای انسان؛ این حالت پیش‌فرض است (به‌جز موارد ذکرشده در زیر)؛
تولید خروجی مناسب ماشین؛ این حالت پیش‌فرض است اگر clinfo با نامی فراخوانی شود که حاوی رشته “raw” باشد؛
داده‌های خام را در قالب JSON خروجی می‌دهد (مقایسه کنید با گزینه --raw)؛ پشتیبانی از این گزینه آزمایشی است، زیرا نحوه نمایش برخی از مقادیر هنوز نهایی نشده است؛
دستگاه‌های آفلاین را نیز برای پلتفرم‌هایی که این قابلیت را ارائه می‌دهند نشان می‌دهد؛
تلاش می‌کند با پلتفرم NULL مانند یک پلتفرم عادی رفتار کند، و ویژگی‌ها و دستگاه‌های آن را دریافت کرده و نشان دهد؛ این علاوه بر آزمایش‌های رفتاری پلتفرم NULL است که در انتها انجام می‌شود، و می‌تواند در سیستم‌هایی که هیچ پلتفرم ICD در آن‌ها وجود ندارد، اما یک پلتفرم درون خود کتابخانه OpenCL به صورت مستقیم کدنویسی شده است، مفید باشد؛
فهرست کردن پلتفرم‌ها و دستگاه‌ها بر اساس نام، بدون ویژگی‌های (دیگر)؛
فقط ویژگی‌های دستگاه مشخص‌شده در پلتفرم مشخص‌شده را نشان می‌دهد؛ می‌توان چندین مشخصه دستگاه را در خط فرمان مشخص کرد؛
فقط ویژگی‌هایی را نشان می‌دهد که نام نمادین آن‌ها با property-name داده‌شده مطابقت داشته باشد (آن را به عنوان یک زیررشته شامل شود)؛ نام به صورت حروف بزرگ و با جایگزینی خط فاصله (-) با خط زیر (_) نرمال‌سازی می‌شود؛ می‌توان چندین مشخصه ویژگی را در خط فرمان مشخص کرد؛ وقتی این فلگ مشخص شود، حالت خام (raw) اجباری می‌شود؛
نمایش راهنمای استفاده؛
نمایش نسخه برنامه.

OpenCL 1.1, OpenCL 1.2, OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, OpenCL 3.0.

افزونه‌های پشتیبانی‌شده OpenCL:

برای UUID، LUID و ماسک گره (node mask) دستگاه؛
برای ویژگی‌های نسخه‌بندی‌شده گسترش‌یافته پلتفرم، دستگاه، افزونه و IL که از OpenCL 3.0 به نسخه‌های پیشین OpenCL منتقل شده‌اند؛
برای اطلاعات درباره پشتیبانی از انواع داده‌های ممیز شناور با دقت نیمه (half-precision) و دقت مضاعف (double-precision)؛
برای اطلاعات درباره الزامات هم‌ترازی آدرس پایه و گام (pitch) بافرهایی که به عنوان پایه برای تصاویر دوبعدی استفاده می‌شوند؛
برای اطلاعات درباره نمایش‌های پشتیبانی‌شده زبان میانی (IL)؛
برای اطلاعات درباره نسخه‌های پشتیبانی‌شده نمایش میانی استاندارد قابل حمل (SPIR)؛
برای پسوند توابع افزونه‌های عرضه‌کننده؛
برای حداکثر تعداد سدهای نام‌گذاری‌شده زیرگروه؛
برای قابلیت‌های خاتمه دادن به دستگاه؛
برای پشتیبانی از تقسیم دستگاه (device fission) در دستگاه‌های OpenCL 1.1؛
برای اطلاعات گذرگاه PCI (همچنین cl_nv_device_attribute_query و cl_amd_device_attribute_query را ببینید)؛
برای افزونه شمارنده‌های اتمیک؛
برای قابلیت‌های اتمیک ممیز شناور برای دقت نیمه، یگانه و مضاعف (بسته به پشتیبانی سخت‌افزار از اندازه ممیز شناور)؛
برای نسخه زبان C++ for OpenCL که توسط کامپایلر دستگاه پشتیبانی می‌شود؛
برای ویژگی‌های دستگاه اختصاصی AMD؛
برای نمایش حداکثر تعداد کلیدهای پشتیبانی‌شده توسط پلتفرم؛
برای نمایش دستگاه‌های آفلاین ارائه‌شده توسط پلتفرم، در صورت درخواست (گزینه --offline را ببینید)؛
برای نمایش تعداد و شناسه‌های دستگاه‌های P2P موجود؛
برای قابلیت‌های حافظه مجازی مشترک (SVM) در دستگاه‌های OpenCL 1.2؛
برای نمایش فهرست (احتمالاً تنک) شناسه‌های هسته‌ای که ممکن است دستگاه بازگرداند؛
برای نمایش فهرست (احتمالاً تنک) اسلات‌های کاری در دسترس برای ارسال دستورات؛
برای نمایش کنترل‌های زمان‌بندی کار پشتیبانی‌شده و مجموعه‌های موجود برای تخصیص ثبات‌ها؛
برای ویژگی‌های دستگاه اختصاصی NVIDIA؛
برای ویژگی‌های دستگاه اختصاصی Intel؛
برای افزونه Intel که به دستگاه‌های پردازنده (CPU) اجازه می‌دهد کرنل‌ها را به عنوان بخشی از نخ میزبان جاری اجرا کنند؛
برای نسخه شتاب‌دهنده تخمین حرکت پیشرفته Intel؛
برای نسخه و قابلیت‌های پشتیبانی‌شده از تخمین حرکت AVC سمت دستگاه Intel؛
برای حداکثر ابعاد تصاویر مسطح YUV؛
برای اشتراک‌گذاری همزمان کانتکست‌های CL/GL/DirectX (فقط پشتیبانی جزئی)؛
برای شمارش اندازه‌های مجاز زیرگروه؛
برای شمارش صف‌های دستور موجود و ویژگی‌ها و قابلیت‌های آن‌ها؛
برای افزونه Altera جهت پرس‌وجوی دمای هسته دستگاه؛
برای افزونه QUALCOMM جهت پرس‌وجوی اندازه صفحه و فاصله‌گذاری (padding) مورد نیاز در تخصیص حافظه خارجی.

برخی اطلاعات در صورتی که از چندین منبع در دسترس باشند، تکرار می‌شوند. مثال‌ها:

  • انواع پارتیشن و دامنه‌های پشتیبانی‌شده دستگاه که با استفاده از افزونه cl_ext_device_fission به دست می‌آیند، معمولاً با موارد به‌دست‌آمده با استفاده از قابلیت پارتیشن دستگاه در هسته OpenCL 1.2 مطابقت دارند؛
  • مضرب اندازه ترجیحی گروه کاری با اندازه warp انویدیا (روی دستگاه‌های NVIDIA) یا پهنای wavefront در AMD (روی دستگاه‌های AMD) مطابقت دارد.

برخی از فلگ‌های پیکربندی ممیز شناور ممکن است فقط برای دقت‌های خاص یا نسخه‌های خاصی از OpenCL معنادار باشند. به عنوان مثال، CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT فقط برای دقت یگانه در دستگاه‌های OpenCL 1.2 مرتبط است.

رفتار تعریف‌شده توسط پیاده‌سازی برای پلتفرم NULL یا ویژگی‌های کانتکست، برای فراخوانی‌های API زیر آزمایش می‌شود:

با تلاش برای نمایش نام پلتفرم؛
با تلاش برای شمارش دستگاه‌ها؛ سپس پلتفرم مربوطه (در صورت وجود) با پرس‌وجوی پلتفرم دستگاه از نخستین دستگاه شناسایی می‌شود؛
با تلاش برای ساخت یک کانتکست از یک دستگاه از فهرست قبلی (در صورت وجود)، و یک کانتکست از یک دستگاه از پلتفرمی دیگر؛
با تلاش برای ساخت کانتکست‌ها برای هر نوع دستگاه (به‌جز DEFAULT).

پشتیبانی از ویژگی‌های OpenCL 2.x به طور کامل آزمایش نشده است.

پشتیبانی از cl_khr_subgroup_named_barrier به دلیل نبود تعاریف در هدرهای رسمی OpenCL، آزمایشی است.

خروجی خام (قابل تجزیه توسط ماشین) آزمایشی در نظر گرفته می‌شود؛ قالب خروجی ممکن است همچنان دستخوش تغییرات شود.

ویژگی‌های بارگذار ICD نیز در صورتی که تابع افزونه clGetICDLoaderInfoOCLICD یافت شود، مورد پرس‌وجو قرار خواهند گرفت.

پشتیبانی از ویژگی‌های ارائه‌شده توسط cl_amd_copy_buffer_p2p آزمایشی است.

پشتیبانی از برخی ویژگی‌های (مستندشده و مستندنشده) ارائه‌شده توسط cl_amd_device_attribute_query آزمایشی است (همچنین بخش محدودیت‌ها (LIMITATIONS) را ببینید).

پشتیبانی از فهرست‌های تعامل‌پذیری (interop) ارائه‌شده توسط cl_intel_simultaneous_sharing آزمایشی است.

بالاترین نسخه OpenCL پشتیبانی‌شده توسط بارگذار ICD با برخی روش‌های اکتشافی ساده (نمادهای یافت‌شده) شناسایی می‌شود؛ در صورتی که این نسخه از بالاترین نسخه OpenCL پلتفرم کمتر باشد، یا اگر نسخه شناسایی‌شده با نسخه اعلام‌شده توسط خود بارگذار ICD مطابقت نداشته باشد، پیامی نمایش داده می‌شود.

OpenCL تا نسخه 3.0 روش صریحی برای تشخیص نسخه پشتیبانی‌شده از هر افزونه ارائه‌شده توسط یک دستگاه ارائه نکرده بود. این امر در بسیاری از شرایط، تعیین پیشینی این موضوع را که آیا پرس‌وجوی موفقیت‌آمیز یک ویژگی خاص از دستگاه امکان‌پذیر است یا خیر، غیرممکن می‌سازد، حتی اگر دستگاه پشتیبانی از یک افزونه معین را اعلام کرده باشد. علاوه بر این، اندازه و مفهوم واقعی برخی از ویژگی‌ها به طور رسمی در هیچ کجا اعلام نشده است.

به‌ویژه این موضوع بر افزونه‌هایی مانند cl_amd_device_attribute_query، cl_nv_device_attribute_query و cl_arm_core_id تأثیر می‌گذارد. روش‌های اکتشافی مبتنی بر پشتیبانی از نسخه استاندارد تا حدی در کد استفاده می‌شوند تا مشخص شود کدام نسخه ممکن است پشتیبانی شود.

ویژگی‌هایی که مشخص شده است تحت تأثیر این محدودیت‌ها قرار دارند عبارتند از:

که در نسخه 3 از مشخصات افزونه cl_amd_device_attribute_query به عنوان حافظه آزاد سراسری بر حسب کیلوبایت مستند شده است، بدون اینکه توضیحی درباره علت وجود دو مقدار ارائه شده باشد؛ هرچند در کد منبع استک ROCm مقدار دوم به عنوان بزرگ‌ترین بلوک آزاد مستند شده است؛
که در نسخه 3 از مشخصات افزونه cl_amd_device_attribute_query مستند شده است، اما توسط درایورهایی که از سایر ویژگی‌های نسخه 3 پشتیبانی می‌کنند گزارش نمی‌شود. این مورد اکنون برای درایورهایی که فرض می‌شود از نسخه 4 همین افزونه پشتیبانی می‌کنند فعال شده است؛
ارائه‌شده توسط cl_khr_terminate_context که مقدار آن میان OpenCL 1.x و 2.x تغییر کرده است، و ظاهراً یک میدان بیتی (bitfield) است که با این حال مقادیر آن در هیچ کجا تعریف نشده‌اند.

لطفاً هرگونه مشکل را در ردیاب پروژه در GitHub گزارش دهید.

اگر چندین پلتفرم OpenCL که از کتابخانه‌های مشترک LLVM استفاده می‌کنند در سیستم وجود داشته باشند، ممکن است clinfo (و سایر برنامه‌های کاربردی OpenCL) با خطاهایی مشابه

: CommandLine Error: Option '(some option name)' registered more than once!
LLVM ERROR: inconsistency in registered CommandLine options

یا مانند آن دچار کرش شوند. این یک اشکال در clinfo، یا در هیچ‌یک از پلتفرم‌ها یا برنامه‌های کاربردی OpenCL نیست، بلکه به دلیل نحوه مدیریت LLVM در تجزیه گزینه‌های خط فرمان خودش است. این مشکل در بالادست به عنوان گزارش اشکال شماره 30587 گزارش شده است. برای راهکارهای احتمالی و کمک به شناسایی پلتفرم‌های دارای تداخل، نکته بعدی را ببینید.

پلتفرم‌های معیوب OpenCL ممکن است باعث بروز خطای نقض حافظه (segmentation fault) در clinfo در طول مرحله جمع‌آوری اطلاعات شوند، گاهی اوقات حتی پیش از اینکه هرگونه خروجی نمایش داده شود. کار چندانی از دست clinfo برای جلوگیری از این امر ساخته نیست. اگر مشاهده کردید این اتفاق رخ می‌دهد، سعی کنید همه پلتفرم‌ها را غیرفعال کرده و سپس آن‌ها را یکی‌یکی دوباره فعال کنید تا زمانی که کرش مجدداً اتفاق بیفتد. به احتمال زیاد آخرین پلتفرمی که فعال کرده‌اید به نوعی معیوب است (یا به دلیل ناسازگاری با سایر پلتفرم‌ها یا به دلیل نبود اجزای ضروری و عدم مدیریت مناسب نبود آن‌ها).

برای فعال یا غیرفعال کردن گزینشی پلتفرم‌ها، یک روش انتقال یا تغییر نام فایل‌های *.icd موجود در /etc/OpenCL/vendors/ و سپس بازگردانی آن‌ها یکی پس از دیگری است. هنگام استفاده از کتابخانه نرم‌افزار آزاد ocl-icd برای OpenCL، می‌توان با تنظیم متغیرهای محیطی OPENCL_VENDOR_PATH یا OCL_ICD_VENDORS به اثر مشابهی دست یافت، همان‌طور که در libOpenCL(7) مستند شده است. سایر پیاده‌سازی‌های libOpenCL نیز شناخته شده‌اند که از OPENCL_VENDOR_PATH پشتیبانی می‌کنند.

مثال
find /etc/OpenCL/vendors/ -name '*.icd' | while read OPENCL_VENDOR_PATH ; do clinfo -l > /dev/null ; echo "$? ${OPENCL_VENDOR_PATH}" ; done

این دستور تک‌خطی clinfo -l را برای هر پلتفرم به صورت مجزا اجرا می‌کند (خروجی عادی را پنهان می‌سازد)، و مسیر .icd را با پیشوند 0 برای اجراهای موفقیت‌آمیز، و یک مقدار غیر صفر برای پلتفرم‌های معیوب گزارش می‌دهد.

2025-02-14 clinfo 3.0.25.02.14