سؤال

(آسف إذا كان هذا يبدو وكأنه صراخ ، لكنه سؤال حقيقي وسأقدر إجابات حقيقية)

أفهم أنه نظرًا لأن C قديم جدًا ، فقد يكون من المنطقي إضافته في ذلك الوقت (MMX لم يكن موجودًا في ذلك الوقت). ولكن منذ ذلك الحين ، كان هناك C99 ، ولا يزال هناك معيار لمتغيرات SIMD (بقدر ما أعرف).

بواسطة "متغيرات SIMD" ، أعني شيئًا مثل:

vec2_int a = {2, 2};
vec2_int b = {3, 3};
a += b;

أفهم أيضًا أنه يمكن القيام بذلك باستخدام الهياكل و (من الناحية النظرية) يجب على المترجم تحسينه لاستخدام SIMD عند الاقتضاء على أي حال.

لكنني رأيت مؤخرًا منشورًا من QT Labs الذي يتضمن مثالاً مع أنواع مثل "__M128i" (التي تبدو غير قياسية بوضوح) ، بدلاً من الاعتماد على التحسينات. بالنظر إلى أن QT تعلن عن ذلك على أنه تحسين سرعة QT ، فإنني أعتقد أن تحسينات المترجمة غير كافية ، على الأقل بالنسبة لبعض المبرمجين.

إذا كان الأمر مجرد ج ، أعتقد أن C كان غبيًا. ولكن ، على حد علمي ، لا تتضمن اللغات الأحدث مثل C ++ و Java و C# هذه اللغات أيضًا. C# لديه mono.simd ولكنه ليس نوعًا بدائيًا (وبما أن C# يحتوي على كلمة رئيسية "عشرية" ، لا أعتقد أنهم كانوا يحاولون حفظ الأنواع).

لذا ، إليك ما ألاحظه: يبدو أن اللغات ذات الأنواع البدائية المتجهات هي الاستثناء وليس القاعدة. نظرًا لأن الأنواع البدائية المتجهات تبدو واضحة للغاية ، فأنا أعتقد أنه يجب أن تكون هناك بعض الأسباب اللائقة لعدم تضمين هذه الأنواع.

هل يعرف أي شخص هنا لماذا يتم استبعاد هذه الأنواع بشكل متكرر؟ بعض الروابط إلى المنطقية ضد إضافتها؟

هل كانت مفيدة؟

المحلول

لأن جميع المعالجات تدعم تعليمات SIMD. تم تصميم لغات مثل C و C ++ (وحتى Java و C#) لاستخدامها في أنواع مختلفة من الأجهزة ، مثل موكّنات متحكم ، بالإضافة إلى أجهزة الكمبيوتر المكتبية.

حاليًا ، لا تكون عودة الخوارزميات تلقائية (على الرغم من أن ذلك يتم البحث بنشاط). يجب أن تتم كتابة الخوارزميات "القابلة للتجزئة" بشكل صريح للاستفادة من أي قدرات SIMD لبيئة التنفيذ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top