سؤال

في العامين الماضيين، كنت أقوم بالكثير من برمجة SIMD وفي معظم الأوقات كنت أعتمد على وظائف المترجم الجوهرية (مثل تلك الخاصة ببرمجة SSE) أو على تجميع البرمجة للوصول إلى التصميم الأنيق حقًا أشياء.ومع ذلك، حتى الآن لم أتمكن من العثور على أي لغة برمجة تتضمن دعمًا مدمجًا لـ SIMD.

من الواضح الآن أن هناك لغات تظليل مثل HLSL وCg وGLSL التي تتمتع بدعم أصلي لهذا النوع من الأشياء، ومع ذلك، فأنا أبحث عن شيء قادر على الأقل على التحويل البرمجي إلى SSE دون التحويل التلقائي ولكن مع دعم مدمج لعمليات المتجهات .هل توجد مثل هذه اللغة؟

هذا مثال على (جزء من) تظليل Cg الذي يسلط الضوء ومن حيث بناء الجملة ربما يكون هذا هو الأقرب إلى ما أبحث عنه.

float4 pixelfunction(
    output_vs IN, 
    uniform sampler2D texture : TEX0, 
    uniform sampler2D normals : TEX1, 
    uniform float3 light, 
    uniform float3 eye ) : COLOR
{
    float4 color    = tex2D( texture, IN.uv );
    float4 normal   = tex2D( normals, IN.uv ) * 2 - 1;

    float3 T = normalize(IN.T);
    float3 B = normalize(IN.B);

    float3 N = 
        normal.b * normalize(IN.normal) +
        normal.r * T +
        normal.g * B;

    float3 V = normalize(eye - IN.pos.xyz);
    float3 L = normalize(light - IN.pos);
    float3 H = normalize(L + V);

    float4 diffuse  = color * saturate( dot(N, L) );
    float4 specular = color * pow(saturate(dot(N, H)), 15);
    float falloff   = dot(L, normalize(light));

    return pow(falloff, 5) * (diffuse + specular);
}

الأشياء التي ستكون ضرورية حقًا في هذه اللغة هي:

  • بنيت في مشغلي أفرط
  • عمليات المتجهات (نقطة، تقاطع، تطبيع، تشبع، تعكس وما إلى ذلك)
  • دعم أنواع البيانات المخصصة (البنيات)
  • سيكون التفرع الديناميكي أمرًا رائعًا (للحلقات، إذا كانت البيانات)
هل كانت مفيدة؟

المحلول 3

حتى مؤخرا صدر إنتل ISPC وهو بالضبط ما كنت أبحث عنه عندما طرحت هذا السؤال.إنها لغة يمكن ربطها بكود C العادي، ولها نموذج تنفيذ ضمني، وتدعم جميع الميزات المذكورة في منشور البداية (عوامل التشغيل، والتفرع، وهياكل البيانات، وعمليات المتجهات، والتظليل مثل) وتجميع SSE2، وSSE4، تعليمات ناقلات AVX وAVX2 وXeon Phi.

نصائح أخرى

أفضل رهان لك هو على الأرجح OpenCL.أعلم أنه تم الترويج لها في الغالب كوسيلة لتشغيل التعليمات البرمجية على وحدات معالجة الرسومات، ولكن يمكن أيضًا تجميع نواة OpenCL وتشغيلها على وحدات المعالجة المركزية.OpenCL هو في الأساس لغة C مع بعض القيود:

  1. لا توجد مؤشرات وظيفية
  2. لا العودية

وحفنة من الإضافات.في أنواع ناقلات معينة:

float4 x = float4(1.0f, 2.0f, 3.0f, 4.0f);
float4 y = float4(10.0f, 10.0f, 10.0f, 10.0f);

float4 z = y + x.s3210 // add the vector y with a swizzle of x that reverses the element order

هناك تحذير كبير وهو أن الكود يجب أن يكون قابلاً للتنفيذ بشكل نظيف، ولا يمكن لـ OpenCL الاتصال بالمكتبات التعسفية، وما إلى ذلك.ولكن إذا كانت نواة الحساب الخاصة بك مستقلة إلى حد معقول، فستحصل بشكل أساسي على ناقل C مُحسّن حيث لا تحتاج إلى استخدام العناصر الجوهرية.

هنا عبارة عن مرجع/ورقة غش سريعة تحتوي على جميع الامتدادات.

إنها ليست اللغة نفسها حقًا، ولكن توجد مكتبة لـ Mono (Mono.Simd) من شأنها أن تعرض لك المتجهات وتحسن العمليات عليها في SSE كلما أمكن ذلك:

إنها مكتبة لـ C++، وليست مدمجة في اللغة، ولكن ايجن غير مرئي تمامًا بمجرد الإعلان عن المتغيرات الخاصة بك.

أفضل حل حاليًا هو أن أفعل ذلك بنفسي عن طريق إنشاء واجهة خلفية للواجهة الأمامية Cg مفتوحة المصدر التي أصدرتها Nvidia، ولكنني أود أن أوفر على نفسي الجهد لذلك أشعر بالفضول إذا تم القيام بذلك من قبل.ويفضل أن أبدأ في استخدامه على الفور.

توفر لغة البرمجة D أيضًا إمكانية الوصول إلى SIMD بطريقة مشابهة لـ Mono.SIMD.

سيكون هذا هو فورتران الذي تبحث عنه.إذا كانت الذاكرة تخدم حتى المترجمين مفتوحي المصدر (g95، gfortran) فسوف يستفيدون من SSE إذا تم تطبيقه على أجهزتك.

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