Vc الآن في وضع الصيانة ولم يعد يتم تطويره بشكل نشط. ومع ذلك، فإننا نواصل مراجعة طلبات السحب مع إصلاحات الأخطاء من المجتمع.
قد تكون مهتمًا بالتبديل إلى std-simd. يتضمن الإصدار 11 من مجلس التعاون الخليجي إصدارًا تجريبيًا من std::simd
كجزء من libstdc++، والذي يعمل أيضًا مع clang. الميزات الموجودة في Vc 1.4 وغير الموجودة في std-simd ستتحول في النهاية إلى Vc 2.0، والذي يعتمد بعد ذلك على std-simd .
تتطلب الأجيال الحديثة من وحدات المعالجة المركزية (CPUs)، ووحدات معالجة الرسومات (GPU) على وجه الخصوص، رموزًا متوازية للبيانات لتحقيق الكفاءة الكاملة. يتطلب توازي البيانات تطبيق نفس تسلسل العمليات على بيانات الإدخال المختلفة. وبالتالي، يمكن لوحدات المعالجة المركزية (CPUs) ووحدات معالجة الرسومات (GPUs) تقليل الأجهزة اللازمة لفك تشفير التعليمات وجدولتها لصالح المزيد من الوحدات الحسابية والمنطقية، التي تنفذ نفس التعليمات بشكل متزامن. في بنيات وحدة المعالجة المركزية يتم تنفيذ ذلك عبر سجلات وتعليمات SIMD. يمكن لسجل SIMD واحد تخزين قيم N ويمكن لتعليمة SIMD واحدة تنفيذ عمليات N على تلك القيم. في بنيات GPU، تعمل الخيوط N في مزامنة مثالية، ويتم تغذيتها بواسطة وحدة فك ترميز/جدولة تعليمات واحدة. يحتوي كل مؤشر ترابط على ذاكرة محلية وفهرس معين لحساب الإزاحات في الذاكرة لعمليات التحميل والمخازن.
يمكن لمترجمي C++ الحاليين إجراء تحويل تلقائي للأكواد العددية إلى تعليمات SIMD (التحويل التلقائي). ومع ذلك، يجب على المترجم إعادة بناء خاصية جوهرية للخوارزمية التي فُقدت عندما كتب المطور تطبيقًا عدديًا بحتًا في لغة C++. وبالتالي، لا يمكن لمترجمي لغة C++ توجيه أي كود معين إلى متغير البيانات الموازي الأكثر كفاءة. غالبًا ما لا يتم تحويل الحلقات المتوازية للبيانات الأكبر حجمًا، والتي تمتد عبر وظائف متعددة أو حتى وحدات ترجمة، إلى رمز SIMD فعال.
توفر مكتبة Vc الرابط المفقود. تتيح أنواعها الإشارة بوضوح إلى العمليات المتوازية للبيانات على قيم متعددة. ولذلك يتم إضافة التوازي عبر نظام الكتابة. توضح الأساليب المتنافسة التوازي من خلال هياكل التحكم الجديدة وبالتالي دلالات جديدة داخل جسم هياكل التحكم هذه.
Vc هي مكتبة برمجيات مجانية لتسهيل النقل الصريح لكود C++. يحتوي على واجهة برمجة تطبيقات بديهية ويوفر إمكانية النقل بين المترجمين المختلفين وإصدارات المترجم بالإضافة إلى إمكانية النقل بين مجموعات تعليمات المتجهات المختلفة. وبالتالي يمكن تجميع تطبيق مكتوب باستخدام Vc من أجل:
بعد أن أسقطت Intel دعم MIC مع ICC 18، قام Vc 1.4 أيضًا بإزالة الدعم له.
std::vector<Particle>
simdize
على العديد من std::vector<float>
. لاحظ مدى أهمية العلم -march
مقارنة بالعلم العادي -mavx2 -mfma
.لنبدأ من الكود الخاص بحساب المنتج العددي ثلاثي الأبعاد باستخدام العوامات المضمنة:
using Vec3D = std::array< float , 3 >;
float scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
باستخدام Vc، يمكننا بسهولة توجيه الكود باستخدام النوع float_v
:
using Vc::float_v
using Vec3D = std::array<float_v, 3 >;
float_v scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
سيتم قياس ما ورد أعلاه إلى 1، 4، 8، 16، إلخ. يتم حساب المنتجات العددية بالتوازي، اعتمادًا على قدرات الأجهزة المستهدفة.
للمقارنة، فإن نفس التوجيه باستخدام جوهر Intel SSE أكثر تفصيلاً ويستخدم تدوين البادئة (أي استدعاءات الوظائف):
using Vec3D = std::array<__m128, 3 >;
__m128 scalar_product (Vec3D a, Vec3D b) {
return _mm_add_ps ( _mm_add_ps ( _mm_mul_ps (a[ 0 ], b[ 0 ]), _mm_mul_ps (a[ 1 ], b[ 1 ])),
_mm_mul_ps (a[ 2 ], b[ 2 ]));
}
لن يتم توسيع ما ورد أعلاه إلى AVX، أو AVX-512، وما إلى ذلك، كما أنه ليس قابلاً للنقل إلى أجهزة SIMD ISA الأخرى.
كميك >= 3.0
مترجم C++ 11:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
اختياريًا، حدد دليل التثبيت:
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
اختياريًا، قم بتضمين بناء اختبارات الوحدة:
$ cmake -DBUILD_TESTING=ON ..
على نظام التشغيل Windows، إذا كان لديك إصدارات متعددة من Visual Studio مثبتة، فيمكنك تحديد أحدها:
$ cmake -G " Visual Studio 16 2019 " ..
راجع cmake --help
للحصول على قائمة بالمولدات المحتملة.
$ cmake --build . -j 16
$ cmake --install . # may require permissions
على نظام التشغيل Windows، يمكنك أيضًا فتح Vc.sln
في Visual Studio والإنشاء/التثبيت من IDE.
يتم إنشاء الوثائق عبر الدوكسيجين. يمكنك إنشاء الوثائق عن طريق تشغيل doxygen
في الدليل الفرعي doc
. وبدلاً من ذلك، يمكنك العثور على إصدارات ليلية من الوثائق على:
العمل على دمج وظائف Vc في مكتبة C++ القياسية.
يتم إصدار Vc بموجب شروط ترخيص BSD المكون من 3 فقرات.