Scroll to navigation

spu_run(2) System Calls Manual 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().

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

حدث خطأ محاذاة DMA.
جرت محاولة لأمر MFC DMA غير صالح.
حدث خطأ تخزين DMA.
نُفذت تعليمة غير قانونية.

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() خطأ، فإن بتة واحدة أو أكثر من الثماني بتات السفلية تُعيَّن دائمًا.

الأخطاء

fd ليس واصف ملف صالح.
npc ليس مؤشرًا صالحًا، أو event غير NULL ومؤشر غير صالح.
حدثت إشارة أثناء تنفيذ spu_run()؛ انظر signal(7). تم تحديث قيمة npc إلى قيمة عداد البرنامج الجديدة إذا لزم الأمر.
fd ليس واصف ملف صالحًا تم إرجاعه من spu_create(2).
لم تكن هناك ذاكرة كافية متاحة لمعالجة خطأ صفحة ناتج عن وصول مباشر للذاكرة من وحدة التحكم في تدفق الذاكرة (MFC).
هذه الوظيفة غير مقدمة من قبل النظام الحالي، لأن الأجهزة لا توفر وحدات 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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

8 فبراير 2026 صفحات دليل لينكس 6.18