سؤال

ليس لدي أي معرفة بمفاهيم برمجة GPU وواجهة برمجة التطبيقات. لدي بضعة أسئلة:

  1. هل من الممكن كتابة جزء من رمز C# المدار وتجميعه/ترجمته إلى نوع من الوحدة النمطية ، والتي يمكن تنفيذها على وحدة معالجة الرسومات؟ أو هل أنا محكوم على تطبيقين ، أحدهما لإدارته على وحدة المعالجة المركزية وواحد ل GPU (أفهم أنه سيكون هناك قيود على ما يمكن تنفيذه على وحدة معالجة الرسومات)؟
  2. هل يوجد واجهة برمجة تطبيقات لائقة وناضجة لبرمجة بشكل مستقل ضد مختلف بائعي أجهزة GPU (أي واجهة برمجة تطبيقات شائعة)؟
  3. هل هناك أي أفضل الممارسات إذا أراد المرء تطوير تطبيقات تعمل على وحدة المعالجة المركزية ، مكتوبة باللغة المدارة ، وكذلك توفير تحسينات السرعة في حالة وجود أجهزة GPU مناسبة؟

سأكون سعيدًا أيضًا بالروابط إلى أي نوع من الوثائق مع موارد التعلم المناسبة.

أفضل ، جوزيف

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

المحلول

1) لا - ليس للحالة العامة لـ C# - من الواضح أنه يمكن إنشاء أي شيء لمجموعة فرعية من اللغة

2) نعم - HLSL باستخدام X Direct أو Open GL

3) غير ممكن عمومًا - تختلف ترميز وحدة المعالجة المركزية و GPU بشكل أساسي

في الأساس ، لا يمكنك التفكير في وحدة المعالجة المركزية وترميز GPU على أنها قابلة للمقارنة. GPU هي أداة معالجة متوازية متخصصة للغاية - للكثير من الحسابات البسيطة المتوازية.

إن محاولة كتابة progam عامة في وحدة معالجة الرسومات مع الكثير من الفروع وما إلى ذلك ، لن تكون فعالة - ربما غير ممكن.

بنيات الوصول إلى الذاكرة مختلفة تمامًا.

يجب أن تكتب لوحدة المعالجة المركزية ولكن قم بزراعة الحسابات المتوازية المناسبة إلى وحدة معالجة الرسومات.

نصائح أخرى

1) لا ، ليس للحالة العامة لـ C#، ولكن مجموعة فرعية صغيرة ، نعم. إما من خلال وقت التشغيل (تحقق من TidePowerd Gpu.net) أو عبر دعم اللغة (LINQ أو اقتباسات التعليمات البرمجية).

2) نعم ، DirectCompute (DX11 Compute Shaders) و OpenCL كلاهما بائع واجهات برمجة التطبيقات المستقلة ، وبراعة واجهات واجهات برمجة المتحدة ويمكنك العثور على ملزمة .NET لهم.

3) لا ، كما قال جيمس ، هم وحش مختلف. GPU عبارة عن معالجات زمنية عالية مُحسّنة للتطبيقات المتوازية لبيانات الإنتاجية العالية في حين أن وحدة المعالجة المركزية هي معالجات الكمون المنخفضة المحسّنة لتطبيقات الأغراض العامة المتسلسلة.

المشروع البحثي الوحيد الذي أعرف أن يحاول معالجة هذه المشكلة هو spap لغة.

نصيحتي ، لا تحاول العثور على API/وقت التشغيل الشامل المثالي لأنه لا يوجد شيء. اختر تقنية موجودة (DirectCompute أو OpenCl) وشاهد كيف يمكنك الاستفادة منها لعملك.

روابط مفيدة للبدء:

1) لا أعرف ذلك ، ولكن قد تكون هناك مكتبة لـ C# يمكن أن تساعدك.

2) opencl. إنها مستقلة عن GPU ويمكن أن تعمل على وحدات المعالجة المركزية.

3) سوف تساعدك OpenCL في ذلك ، يمكنك تجميع وحدة المعالجة المركزية أيضًا مع OpenCL ، على الرغم من أنني لست متأكدًا من مدى رموز الكود الذي يجعله في وحدة المعالجة المركزية. لقد وقعت حقًا في حب Opencl مؤخرًا ، فهي تعمل بشكل جيد حقًا.

هناك ايضا براهما. من المفترض أن يلتقط التعبيرات وتجمعها ل GPU. لم أجرب نفسي.

ولديه Microsoft نموذجًا أوليًا للبحث يسمى مسرع, ، وهو مشابه في الهدف ولكنه مختلف بشكل نحلي.

هل نظرت إلى ALEA GPU؟ هناك مكتبات ، رغم أنها ليست مجانية تمامًا ، لديها ترخيص عادلة. هناك وثائق رائعة وسلسلة أدوات رائعة المظهر.

لصالح Java ، انظر مشروع Aparapi (https://github.com/aparapi/aparapi). يتيح ذلك تشغيل مجموعة فرعية من Java على أي وحدة معالجة الرسومات التي تدعم OpenCL. يتم تنسيق رمز Bytecode لفئات kernel في وقت التشغيل إلى رمز OpenCl. هناك قيود شديدة على رمز Java الذي يمكن أن يتم تنسيقه - لا يمكن استخدام أي كائنات كحقول أو السكان المحليين أو الطريقة.

ومع ذلك ، فإن الميزة الضخمة هي أنه يمكن تنفيذ النواة في Java أو OpenCl (مع تعويض تلقائي لتنفيذ Java Threadpool في حالة عدم توفر جهاز GPU/APU المناسب). هذا يبدو وكأنه أقرب شيء إلى ما تبحث عنه في الجزء 3 من سؤالك (على الرغم من أن اللغة المدارة ليست C#).

لست على علم بأي شيء مشابه في C#.

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