spu_run(2)

الاسم
spu_run - تنفيذ سياق SPU

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <sys/spu.h>          /* تعريف ثوابت SPU_* */
#include <sys/syscall.h>      /* تعريف ثوابت SYS_* */
#include <unistd.h>

int syscall(SYS_spu_run, int fd, uint32_t *npc, uint32_t *event);

ملاحظة: لا توفر glibc غلافًا لـ spu_run()، مما يستلزم استخدام syscall(2).

الوصف
تُستخدم استدعاء النظام spu_run() على أجهزة PowerPC التي تنفذ بنية Cell Broadband Engine للوصول إلى وحدات المعالجة التآزرية (SPUs). وسيطة fd هي واصف ملف يُرجع بواسطة spu_create(2) يشير إلى سياق SPU محدد. عندما يُجدول السياق إلى SPU فعلي، يبدأ التنفيذ عند مؤشر التعليمات المُمرر في npc.

يحدث تنفيذ كود SPU بشكل متزامن، مما يعني أن spu_run() يُحجب بينما لا يزال SPU قيد التشغيل. إذا كانت هناك حاجة لتنفيذ كود SPU بالتوازي مع كود آخر على وحدة المعالجة المركزية الرئيسية أو SPUs أخرى، فيجب إنشاء خيط تنفيذ جديد أولاً (مثل استخدام pthread_create(3)).

عندما يُرجع spu_run()، تُكتب القيمة الحالية لعداد برنامج SPU إلى npc، لذا يمكن للاستدعاءات المتعاقبة لـ spu_run() استخدام نفس المؤشر npc.

توفر وسيطة event مخزنًا مؤقتًا لرمز حالة ممتد. إذا أُنشئ سياق SPU مع العلم SPU_CREATE_EVENTS_ENABLED، فإن نواة لينكس تملأ هذا المخزن المؤقت قبل أن يُرجع spu_run().

قد يكون رمز الحالة واحدًا (أو أكثر) من الثوابت التالية:

SPE_EVENT_DMA_ALIGNMENT
    حدث خطأ محاذاة DMA.

SPE_EVENT_INVALID_DMA
    جرت محاولة لأمر MFC DMA غير صالح.

SPE_EVENT_SPE_DATA_STORAGE
    حدث خطأ تخزين DMA.

SPE_EVENT_SPE_ERROR
    نُفذت تعليمة غير قانونية.

NULL قيمة صالحة لوسيطة event. في هذه الحالة، لن تُبلغ الأحداث إلى العملية المستدعية.

قيمة الإرجاع
عند النجاح، يُرجع spu_run() قيمة سجل spu_status. عند الفشل، يُرجع -1 ويُعيِّن errno للإشارة إلى الخطأ.

قيمة سجل spu_status هي قناع بت لرموز الحالة واختياريًا رمز 14 بت يُرجع من تعليمة stop-and-signal على SPU. أقنعة البت لرموز الحالة هي:

0x02
    أُوقف SPU بواسطة تعليمة stop-and-signal.

0x04
    أُوقف SPU بواسطة تعليمة halt.

0x08
    ينتظر SPU قناة.

0x10
    SPU في وضع الخطوة الواحدة.

0x20
    حاول SPU تنفيذ تعليمة غير صالحة.

0x40
    حاول SPU الوصول إلى قناة غير صالحة.

0x3fff0000
    تحتوي البتات المُقنَّعة بهذه القيمة على الرمز المُعاد من تعليمة stop-and-signal. هذه البتات صالحة فقط إذا عُيِّنت بتة 0x02.

إذا لم يُرجع spu_run() خطأ، فإن بتة واحدة أو أكثر من الثماني بتات السفلية تُعيَّن دائمًا.

الأخطاء

EBADF
    fd ليس واصف ملف صالح.

EFAULT
    npc ليس مؤشرًا صالحًا، أو event غير NULL ومؤشر غير صالح.

EINTR
    حدثت إشارة أثناء تنفيذ spu_run()؛ انظر signal(7). تم تحديث قيمة npc إلى قيمة عداد البرنامج الجديدة إذا لزم الأمر.

EINVAL
    fd ليس واصف ملف صالحًا تم إرجاعه من spu_create(2).

ENOMEM
    لم تكن هناك ذاكرة كافية متاحة لمعالجة خطأ صفحة ناتج عن وصول مباشر للذاكرة من وحدة التحكم في تدفق الذاكرة (MFC).

ENOSYS
    هذه الوظيفة غير مقدمة من قبل النظام الحالي، لأن الأجهزة لا توفر وحدات SPUs أو لأن وحدة spufs غير محملة.

المعايير
لينكس على PowerPC.

التاريخ
لينكس 2.6.16.

ملاحظات
spu_run() مخصص للاستخدام من المكتبات التي تنفذ واجهة أكثر تجريدًا لـ SPUs، وليس للاستخدام من التطبيقات العادية. انظر http://www.bsc.es/projects/deepcomputing/linuxoncell/ للمكتبات الموصى بها.

أمثلة
التالي مثال على تشغيل برنامج SPU بسيط ذو تعليمة واحدة باستخدام استدعاء النظام spu_run().

    #include <err.h>
    #include <fcntl.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>

    int main(void)
    {
        int       context, fd, spu_status;
        uint32_t  instruction, npc;

        context = syscall(SYS_spu_create, "/spu/example-context", 0, 0755);
        if (context == -1)
            err(EXIT_FAILURE, "spu_create");

        /*
         * اكتب تعليمة 'stop 0x1234' إلى ذاكرة
         * التخزين المحلي لـ SPU.
         */
        instruction = 0x00001234;

        fd = open("/spu/example-context/mem", O_RDWR);
        if (fd == -1)
            err(EXIT_FAILURE, "open");
        write(fd, &instruction, sizeof(instruction));

        /*
         * اضبط npc على عنوان تعليمة البداية لبرنامج
         * SPU. نظرًا لأننا كتبنا التعليمة في بداية
         * ملف mem، فإن نقطة الدخول ستكون 0x0.
         */
        npc = 0;

        spu_status = syscall(SYS_spu_run, context, &npc, NULL);
        if (spu_status == -1)
            err(EXIT_FAILURE, "open");

        /*
         * يجب أن نرى رمز حالة 0x12340002:
         *   0x00000002 (تم إيقاف spu بسبب stop-and-signal)
         * | 0x12340000 (رمز stop-and-signal)
         */
        printf("SPU Status: %#08x\n", spu_status);

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
close(2), spu_create(2), capabilities(7), spufs(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.