Halide هي لغة برمجة مصممة لتسهيل كتابة رموز معالجة الصور والمصفوفات عالية الأداء على الأجهزة الحديثة. تستهدف هاليد حاليًا:
بدلاً من كونها لغة برمجة مستقلة، تم تضمين Halide في لغة C++. هذا يعني أنك تكتب كود C++ الذي يبني تمثيلًا في الذاكرة لخط أنابيب Halide باستخدام Halide's C++ API. يمكنك بعد ذلك ترجمة هذا التمثيل إلى ملف كائن، أو تجميعه وتشغيله في نفس العملية باستخدام JIT. يوفر Halide أيضًا رابط Python الذي يوفر الدعم الكامل لكتابة Halide المضمن في Python بدون C++.
يتطلب Halide C++ 17 (أو الأحدث) لاستخدامه.
لمزيد من التفاصيل حول ماهية هاليد، راجع https://halide-lang.org.
للحصول على وثائق API راجع https://halide-lang.org/docs.
للحصول على بعض الأمثلة على التعليمات البرمجية، اقرأ البرامج التعليمية عبر الإنترنت على https://halide-lang.org/tutorials. الكود المقابل موجود في الدليل tutorials/
. توجد أمثلة أكبر في دليل apps/
.
إذا حصلت على توزيعة كاملة المصدر وترغب في إنشاء Halide، راجع الملاحظات أدناه.
اعتبارًا من Halide 19.0.0، نوفر عجلات ثنائية على PyPI. توفر Halide روابط لـ C++ وPython. حتى لو كنت تنوي استخدام Halide فقط من C++، فقد تكون النقطة هي الطريقة الأسهل للحصول على بنية ثنائية من Halide.
قد يتم تثبيت الإصدارات الكاملة باستخدام pip
كما يلي:
$ pip install halide
يتم نشر كل التزام بـ main
لاختبار PyPI كإصدار تطوير ويمكن تثبيته مع بعض العلامات الإضافية:
$ pip install halide --pre --extra-index-url https://test.pypi.org/simple
حاليًا، نوفر عجلات لـ: Windows x86-64، وmacOS x86-64، وmacOS Arm64، وLinux x86-64. تم تصميم عجلات Linux للعديد من أنظمة Linux_2_28، مما يجعلها متوافقة على نطاق واسع (Debian 10، Ubuntu 18.10، Fedora 29).
لاستخدام C++ لحزمة النقاط: في Linux وmacOS، يجب أن يعثر أمر find_package
الخاص بـ CMake على Halide طالما أنك في نفس البيئة الافتراضية التي قمت بتثبيته فيها. في نظام التشغيل Windows، ستحتاج إلى إضافة الدليل الجذر للبيئة الافتراضية إلى CMAKE_PREFIX_PATH
. يمكن القيام بذلك عن طريق تشغيل set CMAKE_PREFIX_PATH=%VIRTUAL_ENV%
في cmd
.
يمكن لأنظمة البناء الأخرى العثور على مسار جذر Halide عن طريق تشغيل python -c "import halide; print(halide.install_dir())"
.
وبدلاً من ذلك، إذا كنت تستخدم نظام التشغيل macOS، فيمكنك تثبيت Halide عبر Homebrew كما يلي:
$ brew install halide
يمكن دائمًا العثور على أحدث إصدار من Halide على GitHub على https://github.com/halide/Halide/releases
نحن نوفر إصدارات ثنائية للعديد من الأنظمة الأساسية والبنيات الشائعة، بما في ذلك Windows 32/64 بت x86، و64 بت x86/ARM macOS، و32/64 بت x86/ARM Ubuntu Linux.
تم إنشاء إصدارات macOS باستخدام أدوات سطر أوامر XCode مع Apple Clang 500.2.76. هذا يعني أننا نربط ضد libc++ بدلاً من libstdc++. قد تحتاج إلى ضبط خيارات المترجم وفقًا لذلك إذا كنت تستخدم XCode أقدم والذي لا يتم تعيينه افتراضيًا على libc++.
نحن نستخدم Ubuntu LTS حديثًا لإنشاء إصدارات Linux؛ إذا كانت توزيعتك قديمة جدًا، فقد لا تحتوي على glibc المطلوبة.
تتوفر أيضًا الإصدارات الليلية من Halide وإصدارات LLVM التي نستخدمها في CI على https://buildbot.halide-lang.org/
إذا كنت تستخدم vcpkg لإدارة التبعيات، فيمكنك تثبيت Halide عبر:
$ vcpkg install halide:x64-windows # or x64-linux/x64-osx
تحذير واحد: يقوم vcpkg بتثبيت الحد الأدنى فقط من واجهات Halide الخلفية المطلوبة لتجميع التعليمات البرمجية للنظام الأساسي النشط. إذا كنت تريد تضمين جميع الواجهات الخلفية، فيجب عليك تثبيت halide[target-all]:x64-windows
بدلاً من ذلك. لاحظ أنه نظرًا لأن هذا سيؤدي إلى بناء LLVM، فسوف يستغرق مساحة كبيرة على القرص (تصل إلى 100 جيجابايت).
نحن مهتمون بجلب Halide إلى مديري الحزم المشهورين الآخرين ومستودعات توزيع Linux! نحن نتتبع حالة التوزيعات المختلفة لـ Halide في إصدار GitHub هذا. إذا كانت لديك خبرة في نشر الحزم، فيسعدنا العمل معك!
هناك مجموعتان من متطلبات النظام الأساسي ذات الصلة بـ Halide: تلك المطلوبة لتشغيل مكتبة المترجم في وضع JIT أو AOT، وتلك المطلوبة لتشغيل المخرجات الثنائية لمترجم AOT.
هذه هي مجموعات أدوات المضيف والمنصة التي تم اختبارها لبناء وتشغيل مكتبة مترجم Halide.
مترجم | إصدار | نظام التشغيل | أبنية |
---|---|---|---|
دول مجلس التعاون الخليجي | 9.5 | أوبونتو لينكس 20.04 LTS | x86، x64 |
دول مجلس التعاون الخليجي | 11.4 | أوبونتو لينكس 22.04 LTS | أرم32، أرم64 |
MSVC | 2022 (19.37) | ويندوز 11 (22631) | x86، x64 |
AppleClang | 15.0.0 | ماك 14.4.1 | x64 |
AppleClang | 14.0.0 | ماك 14.6 | أرم64 |
نجح بعض المستخدمين في إنشاء Halide لنظام التشغيل Linux باستخدام Clang 9.0.0+، ولنظام التشغيل Windows باستخدام ClangCL 11.0.0+، ولنظام التشغيل Windows ARM64 من خلال الترجمة المتداخلة مع MSVC. ومع ذلك، فإننا لا نختبر هذه السيناريوهات بشكل فعال، لذلك قد يختلف عدد الأميال المقطوعة.
علاوة على ذلك، نحن على استعداد لدعم (من خلال قبول العلاقات العامة لـ) مجموعات الأنظمة الأساسية وسلسلة الأدوات التي لا تزال تتلقى دعمًا عامًا نشطًا من الطرف الأول من مورديها الأصليين. على سبيل المثال، في وقت كتابة هذا التقرير، كان هذا يستثني نظام التشغيل Windows 7 ويتضمن Ubuntu 18.04 LTS.
من المتوقع أن تحظى خطوط أنابيب AOT المجمعة بدعم أوسع بكثير للنظام الأساسي. تستخدم الثنائيات C ABI، ونتوقع أن يتمكن أي مترجم C متوافق من استخدام الرؤوس التي تم إنشاؤها بشكل صحيح. تتطلب روابط C++ حاليًا الإصدار C++17. إذا اكتشفت مشكلة توافق مع المسار الذي تم إنشاؤه، فيرجى فتح مشكلة.
في أي وقت من الأوقات، يتطلب بناء Halide إما أحدث إصدار ثابت من LLVM، أو الإصدار المستقر السابق من LLVM، أو صندوق الأمتعة. في وقت كتابة هذا التقرير، هذا يعني أن الإصدارات 19 و18 و17 مدعومة، لكن الإصدار 16 ليس كذلك.
من الأسهل الحصول على إصدار ثنائي من LLVM على نظام التشغيل macOS باستخدام Homebrew. فقط قم بتشغيل brew install llvm
. في إصدارات دبيان من Linux، يعد LLVM APT repo هو الأفضل؛ استخدم برنامج التثبيت المقدم. لا نعرف أي إصدارات ثنائية رسمية مناسبة لنظام التشغيل Windows، ولكن الإصدارات التي نستخدمها في CI يمكن العثور عليها عادة على https://buildbot.halide-lang.org، إلى جانب كرات القطران لمنصاتنا الأخرى التي تم اختبارها. راجع القسم الخاص بنظام Windows أدناه للحصول على مزيد من النصائح.
إذا كان نظام التشغيل لديك لا يحتوي على حزم لـ LLVM، أو كنت تريد مزيدًا من التحكم في التكوين، فيمكنك إنشائه بنفسك. تحقق منه أولاً من GitHub:
$ git clone --depth 1 --branch llvmorg-18.1.8 https://github.com/llvm/llvm-project.git
(LLVM 18.1.8 هو أحدث إصدار من LLVM في وقت كتابة هذا التقرير. بالنسبة إلى الجذع الحالي، استخدم main
بدلاً من ذلك)
ثم قم ببنائها هكذا:
$ cmake -G Ninja -S llvm-project/llvm -B build
-DCMAKE_BUILD_TYPE=Release
-DLLVM_ENABLE_PROJECTS= " clang;lld;clang-tools-extra "
-DLLVM_ENABLE_RUNTIMES=compiler-rt
-DLLVM_TARGETS_TO_BUILD= " WebAssembly;X86;AArch64;ARM;Hexagon;NVPTX;PowerPC;RISCV "
-DLLVM_ENABLE_ASSERTIONS=ON
-DLLVM_ENABLE_EH=ON
-DLLVM_ENABLE_RTTI=ON
-DLLVM_ENABLE_HTTPLIB=OFF
-DLLVM_ENABLE_LIBEDIT=OFF
-DLLVM_ENABLE_LIBXML2=OFF
-DLLVM_ENABLE_TERMINFO=OFF
-DLLVM_ENABLE_ZLIB=OFF
-DLLVM_ENABLE_ZSTD=OFF
-DLLVM_BUILD_32_BITS=OFF
$ cmake --build build
$ cmake --install build --prefix llvm-install
سيؤدي هذا إلى تثبيت LLVM فعال في $PWD/llvm-install
. سنشير إلى هذا المسار باسم LLVM_ROOT
لاحقًا. لا تخلط بين شجرة التثبيت هذه وشجرة البناء!
يستغرق إنشاء LLVM وقتًا طويلاً، لذا يستخدم الأمر أعلاه Ninja لزيادة التوازي إلى أقصى حد. إذا اخترت حذف -G Ninja
، فسيتم إنشاء ملفات Makefiles بدلاً من ذلك. في هذه الحالة، قم بتمكين التوازي باستخدام cmake --build build -j NNN
حيث NNN
هو عدد المهام المتوازية، أي عدد وحدات المعالجة المركزية لديك.
لاحظ أنه يجب عليك إضافة clang
و lld
إلى LLVM_ENABLE_PROJECTS
ويجب تضمين WebAssembly
و X86
في LLVM_TARGETS_TO_BUILD
. LLVM_ENABLE_RUNTIMES=compiler-rt
مطلوب فقط لبناء اختبارات Fuzz، و clang-tools-extra
ضروري فقط إذا كنت تخطط للمساهمة بالكود إلى Halide (بحيث يمكنك تشغيل clang-tidy
على طلبات السحب الخاصة بك). يمكنك تعطيل معالجة الاستثناءات (EH) وRTTI إذا كنت لا تريد روابط Python. نوصي بتمكين المجموعة الكاملة لتبسيط عمليات البناء أثناء التطوير.
تمت مناقشة هذا بمزيد من التفصيل في BuildingHalideWithCMake.md. مطلوب الإصدار 3.28+ من CMake لبناء Halide.
اتبع الإرشادات المذكورة أعلاه لإنشاء LLVM أو الحصول على إصدار ثنائي مناسب. ثم قم بتغيير الدليل إلى مستودع Halide وقم بتشغيل:
$ cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DHalide_LLVM_ROOT= $LLVM_ROOT
$ cmake --build build
الإعداد -DHalide_LLVM_ROOT
غير مطلوب إذا كان لديك إصدار مناسب مثبت على مستوى النظام. ومع ذلك، إذا كان لديك عدة LLVMs مثبتة، فيمكنه الاختيار بينها.
نقترح البناء باستخدام Visual Studio 2022. قد يختلف عدد الأميال التي قطعتها مع الإصدارات السابقة. تأكد من تثبيت "أدوات C++ CMake لنظام التشغيل Windows" في برنامج تثبيت Visual Studio. بالنسبة للإصدارات الأقدم من Visual Studio، لا تقم بتثبيت أدوات CMake، ولكن بدلاً من ذلك احصل على CMake وNinja من مواقع المشروع الخاصة بهما.
تبدأ هذه التعليمات من محرك الأقراص D:
:. نحن نفترض أنه تم استنساخ git repo هذا إلى D:Halide
. نفترض أيضًا أنه تم إعداد بيئة الصدفة الخاصة بك بشكل صحيح. بالنسبة لإصدار 64 بت، قم بتشغيل:
D:> "C:Program Files (x86)Microsoft Visual Studio2022CommunityVCAuxiliaryBuildvcvarsall.bat" x64
بالنسبة لإصدار 32 بت، قم بتشغيل:
D:> "C:Program Files (x86)Microsoft Visual Studio2022CommunityVCAuxiliaryBuildvcvarsall.bat" x64_x86
أفضل طريقة للحصول على تبعيات متوافقة على نظام التشغيل Windows هي استخدام vcpkg. تثبيته مثل هذا:
D:> git clone https://github.com/Microsoft/vcpkg.git
D:> cd vcpkg
D:vcpkg> .bootstrap-vcpkg.bat -disableMetrics
...
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake"
عند استخدام ملف سلسلة الأدوات، سيقوم vcpkg تلقائيًا ببناء جميع التبعيات الضرورية. ومع ذلك، كما هو مذكور أعلاه، انتبه إلى أن الحصول على LLVM بهذه الطريقة قد يستخدم أكثر من 100 جيجابايت من مساحة القرص لأشجار البناء الخاصة به ويستغرق وقتًا طويلاً جدًا للبناء. يمكنك حذف أشجار البناء يدويًا بعد ذلك، لكن vcpkg لن يقوم بذلك تلقائيًا.
راجع BuildingHalideWithCMake.md للحصول على توجيهات لاستخدام Vcpkg لكل شيء باستثناء LLVM.
قم بإنشاء شجرة بناء منفصلة واستدعاء CMake باستخدام سلسلة أدوات vcpkg. سيتم إنشاء هذا إما 32 بت أو 64 بت اعتمادًا على البرنامج النصي للبيئة ( vcvars
) الذي تم تشغيله مسبقًا.
D:Halide> cmake -G Ninja -S . -B build ^
--toolchain D:/vcpkg/scripts/buildsystems/vcpkg.cmake ^
-DCMAKE_BUILD_TYPE=Release
ثم قم بتشغيل الإنشاء باستخدام:
D:Halide> cmake --build build
لإجراء جميع الاختبارات:
D:Halide> ctest --test-dir build --output-on-failure
يمكن تحديد مجموعات فرعية من الاختبارات باستخدام -L
وتتضمن correctness
generator
error
وأسماء الدليل الأخرى ضمن tests/
.
اتبع هذه الخطوات إذا كنت تريد إنشاء LLVM بنفسك. أولاً، قم بتنزيل مصادر LLVM (تستخدم هذه التعليمات الإصدار 18.1.8).
D:> git clone --depth 1 --branch llvm-org-18.1.8 https://github.com/llvm/llvm-project.git
كما هو مذكور أعلاه، قم بتشغيل vcvarsall.bat
للاختيار بين x86 وx64. ثم قم بتكوين LLVM باستخدام الأمر التالي (للإصدار 32 بت، قم بتعيين -DLLVM_BUILD_32_BITS=ON
بدلاً من ذلك):
D:> cmake -G Ninja -S llvm-projectllvm -B build ^
-DCMAKE_BUILD_TYPE=Release ^
-DLLVM_ENABLE_PROJECTS=clang;lld;clang-tools-extra ^
-DLLVM_ENABLE_RUNTIMES=compiler-rt ^
-DLLVM_TARGETS_TO_BUILD=WebAssembly;X86;AArch64;ARM;Hexagon;NVPTX;PowerPC;RISCV ^
-DLLVM_ENABLE_ASSERTIONS=ON ^
-DLLVM_ENABLE_EH=ON ^
-DLLVM_ENABLE_RTTI=ON ^
-DLLVM_ENABLE_HTTPLIB=OFF ^
-DLLVM_ENABLE_LIBEDIT=OFF ^
-DLLVM_ENABLE_LIBXML2=OFF ^
-DLLVM_ENABLE_TERMINFO=OFF ^
-DLLVM_ENABLE_ZLIB=OFF ^
-DLLVM_ENABLE_ZSTD=OFF ^
-DLLVM_BUILD_32_BITS=OFF
MSBuild: إذا كنت تريد إنشاء LLVM باستخدام MSBuild بدلاً من Ninja، فاستخدم -G "Visual Studio 17 2022" -Thost=x64 -A x64
أو -G "Visual Studio 17 2022" -Thost=x64 -A Win32
بدلاً من -G Ninja
.
أخيرًا، قم بتشغيل الإنشاء والتثبيت على دليل محلي:
D:> cmake --build build --config Release
D:> cmake --install build --prefix llvm-install
يمكنك استبدال Debug
Release
في أوامر cmake
المذكورة أعلاه إذا كنت تريد إنشاء تصحيح الأخطاء.
لاستخدام هذا مع Halide، مع السماح لـ vcpkg بإدارة التبعيات الأخرى، يجب عليك إضافة علامتين إلى سطر أوامر تكوين CMake الخاص بـ Halide. أولاً، قم بتعطيل LLVM باستخدام -DVCPKG_OVERLAY_PORTS=cmake/vcpkg
. ثانيًا، قم بتوجيه CMake إلى Halide المبني حديثًا باستخدام -DHalide_LLVM_ROOT=D:/llvm-install
.
افعل ما تفعله برامج البناء: https://buildbot.halide-lang.org/master/#/builders
إذا كان الصف الذي يطابق نظامك بشكل أفضل باللون الأحمر، فربما لم تكن الأمور معطلة بالنسبة لك فقط. إذا كان باللون الأخضر، فيمكنك النقر للوصول إلى أحدث إصدار ورؤية الأوامر التي تقوم روبوتات البناء بتشغيلها. افتح خطوة ("تكوين Halide" مفيد) وانظر إلى سجلات "stdio" في العارض. تحتوي هذه السجلات على الأوامر الكاملة التي تم تشغيلها، بالإضافة إلى متغيرات البيئة التي تم تشغيلها بها.
تحذير
نحن لا نقدم الدعم لـ Makefile. لا تتردد في استخدامه، ولكن إذا حدث أي خطأ، قم بالتبديل إلى إصدار CMake. لاحظ أيضًا أن Makefile لا يمكنه إنشاء روابط Python أو إنتاج حزم التثبيت.
TL;DR : قم بتثبيت LLVM 17 (أو أكبر) make
في الدليل الجذر للمستودع (حيث يوجد ملف README هذا).
افتراضيًا، سيستخدم make
أداة llvm-config
الموجودة في المسار PATH
. إذا كنت تريد استخدام LLVM مختلفًا، مثل LLVM مُصمم خصيصًا باتباع الإرشادات المذكورة أعلاه، فقم بتعيين متغير البيئة التالي:
$ export LLVM_CONFIG= " $LLVM_ROOT /bin/llvm-config "
الآن يجب أن تكون قادرًا على تشغيل make
في الدليل الجذر لشجرة Halide المصدرية. سيقوم make run_tests
بتشغيل مجموعة اختبار JIT، وسيتأكد make test_apps
من تجميع جميع التطبيقات وتشغيلها (ولكن لن يتحقق من مخرجاتها).
عند إنشاء الاختبارات، يمكنك تعيين هدف التحويل البرمجي AOT باستخدام متغير البيئة HL_TARGET
.
إذا كنت ترغب في بناء Halide في دليل منفصل، يمكنك القيام بذلك على النحو التالي:
$ cd ..
$ mkdir halide_build
$ cd halide_build
$ make -f ../Halide/Makefile
HL_JIT_TARGET=...
سيحدد هدف تجميع JIT الخاص بـ Halide.
HL_DEBUG_CODEGEN=1
سوف يقوم بطباعة الكود الكاذب لما تقوم هاليد بتجميعه. ستطبع الأرقام الأعلى المزيد من التفاصيل.
HL_NUM_THREADS=...
يحدد عدد سلاسل الرسائل التي سيتم إنشاؤها لتجمع سلاسل الرسائل. عند استخدام توجيه الجدولة غير المتزامنة، قد تكون هناك حاجة إلى سلاسل رسائل أكثر من هذا العدد وبالتالي تخصيصها. يُسمح بحد أقصى 256 موضوعًا. (افتراضيًا، يتم استخدام عدد النوى الموجودة على المضيف.)
HL_TRACE_FILE=...
يحدد ملف هدف ثنائي لتفريغ بيانات التتبع فيه (يتم تجاهله ما لم يتم تمكين ميزة trace_
واحدة على الأقل في الهدف). يمكن تحليل المخرجات برمجيًا عن طريق البدء من الكود الموجود في utils/HalideTraceViz.cpp
.
لدينا المزيد من الوثائق في doc/
، الروابط التالية قد تكون مفيدة:
وثيقة | وصف |
---|---|
بناء CMake | كيفية تكوين وبناء Halide باستخدام CMake. |
حزمة Cmake | كيفية استخدام حزمة Halide CMake لإنشاء التعليمات البرمجية الخاصة بك. |
مسدس | كيفية استخدام الواجهة الخلفية السداسية. |
بايثون | توثيق روابط بايثون. |
RunGen | كيفية استخدام واجهة RunGen لتشغيل خطوط الأنابيب العشوائية وقياسها. |
فولكان | كيفية استخدام الواجهة الخلفية Halide Vulkan (نسخة تجريبية) |
WebAssembly | كيفية استخدام الواجهة الخلفية WebAssembly وكيفية استخدام V8 بدلاً من wabt. |
WebGPU | كيفية تشغيل خطوط أنابيب WebGPU (بيتا) |
الروابط التالية ذات أهمية أكبر للمطورين الراغبين في المساهمة بالكود في Halide:
وثيقة | وصف |
---|---|
مطور CMake | إرشادات لتأليف كود CMake الجديد. |
FuzzTesting | معلومات حول اختبار الزغب لمترجم Halide (بدلاً من خطوط الأنابيب). مخصص للمطورين الداخليين. |