[日本語]
الحوسبة الموازية مع opencl على وحدات معالجة الرسومات وحامل وحدات المعالجة المركزية.

LUX.GPU.OpenCL Library
TOpenCL: Singleton of tclsystem
┃
TCLSystem: نظام
┗TCLPlatfos: قائمة المنصات
TCLPlatfoمنصة
┣TCLExtenss: قائمة تمديد
TCLDevices: قائمة الأجهزة
┃ ┗TCLDevice: الجهاز
┗TCLContexs: قائمة السياق
┗TCLContex: سياق
┣TCLQueuers: قائمة قائمة انتظار الأوامر
┃ ┗TCLQueuer: قائمة انتظار الأوامر
┣TCLArgumes: قائمة وسيطة
┃ ┣TCLBuffer: المخزن المؤقت
┃ ┣TCLImager:
┃ ┗TCLSamplr: أخذ العينات
┣TCLLibrars: قائمة المكتبة
┃ ┗TCLLibrar: مكتبة
┗TCLExecuts: قائمة برنامج قابل للتنفيذ
┗TCLExecut: برنامج قابل للتنفيذ
┣TCLBuildrs: قائمة بناء
┃ ┗TCLBuildr: بناء
┗TCLKernels: قائمة kernel
┗TCLKernel: نواة
┗TCLParames: قائمة المعلمات
TCLParame: المعلمة
فئة TOpenCL هي مفردة من فئة TCLSystem . تكتشف فئة TCLSystem تلقائيًا جميع أجهزة الحوسبة الموجودة على الجهاز المضيف.
يمثل كائن " النظام الأساسي " ( TCLPlatfo ) البيئة التي يوفرها كل بائع جهاز. تكتشف فئة TCLSystem تلقائيًا جميع المنصات S وتسردها في خاصية Platfos[] .
Object PascalTOpenCL.Platfos.Count :Integer // Number of all platforms TOpenCL.Platfos[*] :TCLPlatfo // Array of all platforms
توفر فئة TCLPlatfo معلومات حول منصة معينة كخصائص.
Object Pascal_Platfo := TOpenCL.Platfos[ 0 ]; // Selecting a specific platform _Platfo.Handle :T_cl_platform_id // Pointer _Platfo.Profile :String // Profile _Platfo.Version :String // Version _Platfo. Name :String // Name _Platfo.Vendor :String // Vendor Name _Platfo.Extenss.Count :Integer // Number of Extensions _Platfo.Extenss[*] :String // Array of Extensions
يمثل كائن " الجهاز " ( TCLDevice ) وحدة معالجة الرسومات المادية أو وحدة المعالجة المركزية. تكتشف فئة TCLPlatfo تلقائيًا جميع كائنات الجهاز في كائن نظام أساسي معين وتعدادها في خاصية Devices[] .
Object Pascal_Platfo.Devices.Count :Integer // Number of devices _Platfo.Devices[*] :TCLDevice // Array of devices
توفر فئة TCLDevice معلومات مفصلة عن كل جهاز معين من خلال خصائصه.
Object Pascal_Device := _Platfo.Devices[ 0 ]; // Selecting a specific device _Device.Handle :T_cl_device_id // Pointer _Device.DEVICE_TYPE :T_cl_device_type // Type _Device.DEVICE_VENDOR_ID :T_cl_uint // Vendor ID _Device.DEVICE_NAME :String // Name _Device.DEVICE_VENDOR :String // Vendor _Device.DRIVER_VERSION :String // Driver Version _Device.DEVICE_PROFILE :String // Profile _Device.DEVICE_VERSION :String // Version
يدير كائن " السياق " ( TCLContex ) مجموعة من البيانات والبرامج ذات الصلة. يتم إنشاء فئة TCLContex من فئة TCLPlatfo .
Object Pascal_Contex := TCLContex.Create( _Platfo );
يتم تسجيل فئة TCLContex التي تم إنشاؤها في خاصية Contexs[] لفئة TCLPlatfo .
Object Pascal_Platfo.Contexs.Count :Integer // Number of contexts _Platfo.Contexs[*] :TCLContex // Array of contexts ``
يدير كائن " قائمة انتظار الأوامر " ( TCLQueuer ) الأوامر المرسلة إلى الجهاز. بمعنى آخر ، إنه بمثابة جسر بين السياق والجهاز . يتم إنشاء فئة TCLQueuer مع فئات TCLContex و TCLDevice كوسيطات.
Object Pascal_Queuer := TCLQueuer.Create( _Contex, _Device ); { or } _Queuer := _Contex.Queuers[ _Device ];
تقوم فئة TCLContex بتسجيل كائن TCLQueuer في خاصية Queuers[] .
Object Pascal_Contex.Queuers.Count :Integer // Number of command queue _Contex.Queuers[*] :TCLQueuer // Array of command queue
لاحظ أن السياق والجهاز على الأنظمة الأساسية المختلفة لا يمكن أن ينشئوا قائمة انتظار أمر .
Object PascalP0 := TOpenCL.Platfos[ 0 ]; P1 := TOpenCL.Platfos[ 1 ]; P2 := TOpenCL.Platfos[ 2 ]; D00 := P0.Devices[ 0 ]; D01 := P0.Devices[ 1 ]; D02 := P0.Devices[ 2 ]; D10 := P1.Devices[ 0 ]; D20 := P2.Devices[ 0 ]; C0 := TCLContex.Create( P0 ); C1 := TCLContex.Create( P1 ); C2 := TCLContex.Create( P2 ); Q00 := TCLQueuer.Create( C0, D00 ); // OK Q01 := TCLQueuer.Create( C0, D01 ); // OK Q02 := TCLQueuer.Create( C0, D02 ); // OK Q10 := TCLQueuer.Create( C1, D00 ); // Error Q11 := TCLQueuer.Create( C1, D01 ); // Error Q12 := TCLQueuer.Create( C1, D02 ); // Error Q20 := TCLQueuer.Create( C2, D00 ); // Error Q21 := TCLQueuer.Create( C2, D10 ); // Error Q22 := TCLQueuer.Create( C2, D20 ); // OK
TCLArgume
┣TCLMemory
┃ ┣TCLBuffer
┃ ┗TCLImager
TCLSamplr
يقوم كائن " الذاكرة " ( TCLMemory ) بتخزين مختلف البيانات ويشاركه مع الجهاز . يتم إنشاء فئة TCLMemory من فئات TCLContex و TCLQueuer . فئة TCLMemory مجردة وتستمد فئات TCLBuffer و TCLImager .
تقوم فئة TCLBuffer بتخزين صفيف من أي "نوع بسيط" أو "نوع السجل".
إذا كنت ترغب في إرسال مجموعة من نوع الهيكل التالي إلى الجهاز ،
OpenCL Ctypedef struct { int A ; double B ; } TItem ; kernel void Main ( global TItem * Buffer ) { ・・・ }
توليد فئة TCLBuffer على النحو التالي.
Object PascalTItem = record A :Integer; B :Double; end ; _Buffer := TCLBuffer<TItem>.Create( _Contex, _Queuer );
قراءة واكتب بيانات الصفيف من خلال خاصية Data . يجب أن تكون بيانات الصفيف " MAP PED" لمزامنة مع المضيف قبل القراءة أو الكتابة ، و " UNMAP PED" للمزامنة مع الجهاز بعد الاستخدام.
Object Pascal_Buffer.Count := 3 ; // Setting the number of elements _Buffer.Data.Map; // Synchronize data with host _Buffer.Data[ 0 ] := TItem.Create( 1 , 2.34 ); // Writing _Buffer.Data[ 1 ] := TItem.Create( 5 , 6.78 ); // Writing _Buffer.Data[ 2 ] := TItem.Create( 9 , 0.12 ); // Writing _Buffer.Data.Unmap; // Synchronize data with Device
يقوم كائن " الصورة " ( TCLImager ) بتخزين صفيف البكسل في 1D إلى 3D. تعتبر بيانات 3D Voxel أيضًا نوعًا من الصور ثلاثية الأبعاد. فئة TCLImager مجردة وتستمد فئات مختلفة اعتمادًا على تخطيط وقطع القناة الملونة.
TCLImager
┣TCLImager1D
┃ ┣TCLImager1DxBGRAxUInt8
┃ ┣TCLImager1DxBGRAxUFix8
┃ ┣TCLImager1DxRGBAxUInt32
┃ ┗TCLImager1DxRGBAxSFlo32
┣TCLImager2D
┃ ┣TCLImager2DxBGRAxUInt8
┃ ┣TCLImager2DxBGRAxUFix8
┃ ┣TCLImager2DxRGBAxUInt32
┃ ┗TCLImager2DxRGBAxSFlo32
┗TCLImager3D
┣TCLImager3DxBGRAxUInt8
┣TCLImager3DxBGRAxUFix8
┣TCLImager3DxRGBAxUInt32
┗TCLImager3DxRGBAxSFlo32
يمثل الجزء الأول من اسم الفصل بعد الصورة.
- tclimager
1Dx*x*
- البعد :
1D- tclimager
2Dx*x*
- البعد :
2D- tclimager
3Dx*x*
- البعد :
3D
يمثل الجزء الثاني من اسم الفصل ترتيب قناة اللون للصورة.
- tclimager
*xBGRAx*
- ترتيب قناة اللون :
BGRA- tclimager
*xRGBAx*
- ترتيب قناة اللون :
RGBA
يمثل الجزء الثالث من اسم الفصل نوع بيانات اللون للصورة.
- tclimager
*x*xUInt8
- نوع البيانات من جانب الجهاز :
uint8@ opencl c- نوع البيانات من جانب المضيف :
UInt8 (Byte)@ DELPHI- tclimager
*x*xUFix8
- نوع البيانات من جانب الجهاز :
float@ opencl c- نوع البيانات من جانب المضيف :
UInt8 (Byte)@ DELPHI- tclimager
*x*xUInt32
- نوع البيانات من جانب الجهاز :
uint@ opencl c- نوع البيانات من جانب المضيف :
UInt32 (Cardinal)@ Delphi- tclimager
*x*xSFlo32
- نوع البيانات من جانب الجهاز :
float@ opencl c- نوع البيانات من جانب المضيف :
Single@ delphi
تقوم خاصية "countx"/'y'/'z' بتعيين عدد وحدات البكسل في اتجاه x/y/z.
Object Pascal_Imager := TCLDevIma3DxBGRAxUInt8.Create( _Contex, _Queuer ); _Imager.CountX := 100 ; // Number of pixels in the X direction _Imager.CountY := 200 ; // Number of pixels in the Y direction _Imager.CountZ := 300 ; // Number of pixels in the Z direction
يحدد كائن العينات ( TCLSamplr ) طريقة الاستيفاء للحصول على لون البكسل في إحداثيات الأرقام الحقيقية.
يتم إنشاء فئة TCLSamplr مع فئة "TclContex" كوسيطة.
Object Pascal_Samplr := TCLSamplr.Create( _Contex );
يقرأ كائن " البرنامج " ( TCLProgra ) رمز المصدر ويقوم بتجميعه في ثنائي قابل للتنفيذ. يتم إنشاء فئة TCLProgra مع فئة TCLContex كوسيطة. فئة TCLProgra مجردة وتعمل كفئة أساسية لفئات TCLLibrar و TCLExecut ، اعتمادًا على نوع التعليمات البرمجية المصدر.
فئة TCLLibrar هي برنامج لا يتضمن وظائف لتنفيذها مباشرة يسمى نوع المكتبة.
Object Pascal_Librar := TCLLibrar.Create( _Contex ); _Librar.Source.LoadFromFile( ' Librar.cl ' ); // load Sourcecode
فئة TCLExecut هي برنامج يتضمن وظائف ( kernel s) للتنفيذ مباشرة.
Object Pascal_Execut := TCLExecut.Create( _Contex ); _Execut.Source.LoadFromFile( ' Execut.cl ' ); // load Sourcecode
" البناء " ( TCLBuildr ) هو "عمل" يؤديه برنامج ، ولكن يتم تمثيله بشكل صريح كفئة في مكتبتنا.
Object Pascal_Buildr := TCLBuildr.Create( _Execut, _Device ); { or } _Buildr := _Execut.Buildrs[ _Device ]; { or } _Buildr := _Execut.BuildTo( _Device );
كائن kernel (انظر الفصل 2.8.) يقوم تلقائيًا بإنشاء فئة TCLBuildr في وقت التشغيل. ومع ذلك ، يمكنك التحقق من وجود الأخطاء وربطها عن طريق إنشاء كائن TCLBuildr قبل تشغيل kernel.
Object Pascal_Buildr.Handle; // Run build _Buildr.CompileStatus :T_cl_build_status // Compile status _Buildr.CompileLog :String // Compile log _Buildr.LinkStatus :T_cl_build_status // Link status _Buildr.LinkLog :String // Link log
يمثل كائن " kernel " ( TCLKernel ) وظيفة قابلة للتنفيذ في البرنامج.
OpenCL Ckernel void Main ( ・・・ ) { ・・・ }
يتم إنشاء فئة TCLKernel من كائنات TCLExecut و TCLQueuer .
Object Pascal_Kernel := TCLKernel.Create( _Execut, ' Main ' , _Queuer ); { or } _Kernel := _Execut.Kernels.Add( ' Main ' , _Queuer );
يرتبط كائن الذاكرة بالمعلمة في الكود المصدر من خلال خاصية "Parames" لفئة TCLKernel .
Object Pascal_Kernel.Parames[ ' Buffer ' ] := _Buffer; // Connect to buffer _Kernel.Parames[ ' Imager ' ] := _Imager; // Connect to image _Kernel.Parames[ ' Samplr ' ] := _Samplr; // Connect to sampler
يعمل برنامج OpenCL مرارًا وتكرارًا مثل مجموعة حلقة ثلاثية.
Object Pascal_Kernel.GloSizX := 100 ; // Number of loops in X direction _Kernel.GloSizY := 200 ; // Number of loops in Y direction _Kernel.GloSizZ := 300 ; // Number of loops in Z direction
يمكنك أيضًا تحديد مؤشرات الحلقة الدنيا والحد الأقصى.
Object Pascal_Kernel.GloMinX := 0 ; // Start index in X direction _Kernel.GloMinY := 0 ; // Start index in Y direction _Kernel.GloMinZ := 0 ; // Start index in Z direction _Kernel.GloMaxX := 100 - 1 ; // End index in X direction _Kernel.GloMaxY := 200 - 1 ; // End index in Y direction _Kernel.GloMaxZ := 300 - 1 ; // End index in Z direction
Object Pascal_Kernel.Run; // Run