أغلفة C ++ للأوان SIMD
SIMD (تعليمات واحدة ، بيانات متعددة) هي ميزة من المعالجات الدقيقة التي كانت متاحة لسنوات عديدة. تؤدي تعليمات SIMD عملية واحدة على مجموعة من القيم في وقت واحد ، وبالتالي توفر وسيلة لتسريع تنفيذ التعليمات البرمجية بشكل كبير. ومع ذلك ، تختلف هذه التعليمات بين البائعين والمترجمين المعالجين.
يوفر xsimd وسيلة موحدة لاستخدام هذه الميزات لمؤلفي المكتبات. وهي ، يتيح معالجة مجموعات الأرقام مع نفس مشغلي الحساب كما هو الحال بالنسبة للقيم المفردة. كما يوفر التنفيذ المتسارع للوظائف الرياضية المشتركة التي تعمل على دفعات.
ما وراء Xtensor ، تم تبني XSIMD من قبل مشاريع رئيسية مفتوحة المصدر ، مثل Mozilla Firefox و Apache Arrow و Pythran و Krita.
بدأ مشروع XSIMD بسلسلة من مقالات المدونة التي كتبها يوهان مابيل حول كيفية تنفيذ الأغلفة للمستترعات SIMD. يمكن العثور على أرشيف المدونة هنا: عالم C ++. ظل التصميم الموصوف في المقالات قريبة من الهندسة المعمارية الفعلية لـ XSIMD حتى الإصدار 8.0.
الوظائف الرياضية هي تنفيذ خفيف الوزن للخوارزميات التي تم تنفيذها في الأصل في مشروع التعزيز.
يتطلب xsimd مترجم C ++ 11 المتوافق. يتم دعم مجمعي C ++ التالي:
| المترجم | إصدار |
|---|---|
| Microsoft Visual Studio | MSVC 2015 Update 2 وما فوق |
| G ++ | 4.9 وما فوق |
| كلانج | 4.0 وما فوق |
يتم دعم ملحقات مجموعة تعليمات SIMD التالية:
| بنيان | مجموعة التعليمات |
|---|---|
| x86 | SSE2 ، SSE3 ، SSSE3 ، SSE4.1 ، SSE4.2 ، AVX ، AVX2 ، FMA3+SSE ، FMA3+AVX ، FMA3+AVX2 |
| x86 | AVX512BW ، AVX512CD ، AVX512DQ ، AVX512F (GCC7 والأعلى) |
| x86 AMD | FMA4 |
| ذراع | نيون ، نيون 64 ، SVE128/256/512 (حجم المتجه الثابت) |
| webassembly | WASM |
| RISC-V. | RISC-V128/256/512 (حجم المتجه الثابت) |
تتوفر حزمة لـ XSIMD على مدير حزمة Mamba (أو Conda).
mamba install -c conda-forge xsimdتتوفر حزمة لـ XSIMD على مدير حزمة Spack.
spack install xsimd
spack load xsimdيمكنك تثبيته مباشرة من المصادر باستخدام Cmake:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install للبدء في استخدام xsimd ، تحقق من الوثائق الكاملة
http://xsimd.readthedocs.io/
xsimd لديه اعتماد اختياري على مكتبة XTL:
xsimd | xtl (اختياري) |
|---|---|
| يتقن | ^0.7.0 |
| 12.x | ^0.7.0 |
| 11.x | ^0.7.0 |
| 10.x | ^0.7.0 |
| 9.x | ^0.7.0 |
| 8.x | ^0.7.0 |
التبعية على xtl مطلوبة إذا كنت ترغب في دعم Vectorization لـ xtl::xcomplex . في هذه الحالة ، يجب إنشاء مشروعك باستخدام دعم C ++ 14.
الإصدار 8 من المكتبة عبارة عن إعادة كتابة كاملة وهناك بعض الاختلافات الطفيفة مع إصدارات 7.x. سيكون دليل الترحيل متاحًا قريبًا. في الوقت نفسه ، توضح الأمثلة التالية كيفية استخدام كلا الإصدارين 7 و 8 من المكتبة؟
فيما يلي مثال يحسب متوسط مجموعتين من 4 قيم نقاط عائمة مزدوجة ، على افتراض أن تمديد AVX مدعوم:
# include < iostream >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
int main ( int argc, char * argv[])
{
xs::batch< double , xs::avx2> a = { 1.5 , 2.5 , 3.5 , 4.5 };
xs::batch< double , xs::avx2> b = { 2.5 , 3.5 , 4.5 , 5.5 };
auto mean = (a + b) / 2 ;
std::cout << mean << std::endl;
return 0 ;
} لا تنس تمكين امتداد AVX عند بناء المثال. باستخدام GCC أو Clang ، يتم ذلك باستخدام علامة -mavx ، على MSVC ، عليك تمرير خيار /arch:AVX .
يخرج هذا المثال:
( 2.0 , 3.0 , 4.0 , 5.0 )نفس الحساب العام
# include < cstddef >
# include < vector >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
using vector_type = std::vector< double , xsimd::aligned_allocator< double >>;
void mean ( const vector_type& a, const vector_type& b, vector_type& res)
{
std:: size_t size = a. size ();
constexpr std:: size_t simd_size = xsimd::simd_type< double >::size;
std:: size_t vec_size = size - size % simd_size;
for (std:: size_t i = 0 ; i < vec_size; i += simd_size)
{
auto ba = xs::load_aligned (&a[i]);
auto bb = xs::load_aligned (&b[i]);
auto bres = (ba + bb) / 2 .;
bres. store_aligned (&res[i]);
}
for (std:: size_t i = vec_size; i < size; ++i)
{
res[i] = (a[i] + b[i]) / 2 .;
}
}بناء الاختبارات يتطلب cmake.
cmake متاح كحزمة لمعظم توزيعات Linux. علاوة على ذلك ، يمكن أيضًا تثبيتها مع مدير حزمة conda (حتى على Windows):
conda install -c conda-forge cmake بمجرد تثبيت cmake ، يمكنك إنشاء الاختبارات وتشغيلها:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest في سياق التكامل المستمر مع Travis CI ، يتم إجراء الاختبارات في بيئة conda ، والتي يمكن تنشيطها مع
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestتم تصميم وثائق XSIMD بثلاث أدوات
بينما يجب تثبيت Doxygen بشكل منفصل ، يمكنك تثبيت التنفس عن طريق الكتابة
pip install breathe يمكن أيضًا تثبيت التنفس مع conda
conda install -c conda-forge breatheأخيرًا ، قم ببناء الوثائق مع
make html من docs الفرعية.
نستخدم نموذج حقوق الطبع والنشر المشتركة يمكّن جميع المساهمين من الحفاظ على حقوق الطبع والنشر على مساهماتهم.
تم ترخيص هذا البرنامج بموجب ترخيص BSD-3-Cause. انظر ملف الترخيص للحصول على التفاصيل.