سؤال

كنت أقرأ سؤالاً حول تحسين كود c# وكان أحد الحلول هو استخدام c++ مع SSE.هل من الممكن القيام بـ SSE مباشرة من برنامج C#؟

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

المحلول

مونو الافراج عن 2.2 سيكون الدعم SIMD. المدون ميغيل دي إيكازا حول ميزة هنا ، وAPI هو < وأ href = "http://go-mono.com/docs/index.aspx؟tlink=0@N٪3aMono.Simd" يختلط = "noreferrer"> هنا .

وعلى الرغم من أن يكون هناك مكتبة من شأنها دعم التنمية تحت مايكروسوفت ويندوز. NET وقت التشغيل، فإنه لن يكون لها مزايا الأداء التي كنت تبحث عن ما لم تشغيل التعليمات البرمجية تحت وقت مونو. التي قد تكون قابلة للتنفيذ وفقا للظروف الخاصة بك.

تحديث: مونو 2.2 هو صدر

نصائح أخرى

هل يمكن لـ C# إجراء مكالمة SSE بشكل صريح؟

لا.لا يمكن لـ C# إنتاج IL مضمن، ناهيك عن تجميع x86/amd64 المضمن.

سيستخدم CLR، وبشكل أكثر تحديدًا JIT، SSE إذا كان متاحًا مما يلغي الحاجة إلى فرضه في معظم الظروف.أقول أكثر لأنني لست خبيرًا في SSE وأنا متأكد من أن هناك حالات يمكن أن يكون فيها ذلك مفيدًا وأن JIT لا يقوم بالتحسين.

سوف SIMD ل. NET تكون متاحة في المستقبل القريب. <وأ href = "http://blogs.msdn.com/b/clrcodegeneration/archive/2014/05/12/ryujit-ctp4-now-with-more-simd-types-and-better-os-support.aspx "يختلط =" نوفولو "> RyuJIT (والجيل المقبل من JIT مترجم .NET) المطلوبة لهذا ATM الميزة.

ويجب عليك استخدام الطبقة Microsoft.Numerics.Vectors.Vector<T> من Microsoft.Bcl.Simd حزمة لاتخاذ الاستفادة من هذه الميزة. نموذج التعليمات البرمجية هنا .

وبناء على <لأ href = "http://social.msdn.microsoft.com/forums/en-US/clr/thread/7c3db914-152a-4c3c-a9b1-00e94e2a4ac6/" يختلط = "نوفولو noreferrer" عنوان = "المنتدى MSDN"> هذا منتدى النشر، ومترجم MS JIT تلقائيا يستخدم SSE إذا SSE متاح في الجهاز المستهدف.

إذا كان لديك "قطعة" من العمل الذي تريد القيام به، وأفضل رهان هو لأنه يكتب في C ++ باستخدام intrinsics MMX / SSE ثم إجراء CLR تمكنت C فئة بسيطة جدا / ++ التي يلتف وظائف ويعرضها من كطبقة صافي. ثم الشفرة يمكن فقط استخدام هذا التجمع كما لو كانت فئة العادية.

لمزيد من المعلومات حول intrinsics VC يمكنك إلقاء نظرة على هذه الانشودة قليلا كتبت منذ سنوات عديدة.

http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx

وأوه - أفترض كنت ترغب فعلا استخدام وظائف موازية لتسريع شيء ما. كما أشار آخرون - إذا كنت ترغب فقط في نقل البيانات في قطع أكبر، وما شابه ذلك، وJIT يعرف بالفعل كيفية استخدام SSE لتلك الأساسيات

وفيليب هو الصحيح. لدي، وظيفة قديمة أخرى يظهر مثال مشابه، ولكن أكثر تفصيلا. لقد بالفعل تشغيل هذا الرمز، وتعديله نفسي لأثبت لنفسي أنه يعمل. أنا تفكر في استخدام هذه التقنية في مشروع وأنا أعمل وهو السبب في أنني خارج تبحث لمعرفة ما قد تكون جديدة لأن هذا هو قديمة بعض الشيء. كما يوحي المؤلف، يمكنك كتابة أي وظيفة كنت ترغب في C ++، ترجمة عليه، ثم نسخ بايت الدخول الى حسابك في C #.

http://blogs.msdn.com/ ب / devinj / أرشيف / 2005 / 12/07 / 438323.aspx

وأود أن أضيف أن جو CLI C ++ الطبقة هو فكرة جيدة كذلك، ومع ذلك، وأنا لا أعتقد أن العلم مترجم SSE والعلم / مسح متوافقة على نفس المشروع. أنا التحقق من ذلك تماما: لديك لكتابة عالية الأداء الإقتصادي الأداء كود الخاص في مشروع منفصل لاستخدام SSE (/ قوس: SSE أو / قوس: SSE2) مترجم العلم كما / مسح هو incomatible. لفعل أي شيء أكثر تعقيدا من القيام بعملية حسابية بسيطة على عدد قليل من المدخلات، وأعتقد أن هذا هو أفضل نهج.

بالتأكيد يمكنك ذلك (السؤال الأكثر أهمية هو - لماذا تفعل ذلك؟فقط اترك الأمر لوقت التشغيل؛هذه هي وظيفتها).

يتيح لك C# تعيين مفوض إلى عنوان الذاكرة.يمكن أن يحتوي عنوان الذاكرة هذا على رموز تجميع أولية.يمكنك قراءة المزيد عن مدونة مايكل جيانوكافو.

على الرغم من أنني لم أحاول بنفسي، قد يكون من الممكن استخدامها Marshal.GetDelegateForFunctionPointer أيضًا.

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