[日本語]
Параллельные вычисления с 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: Список ядра
┗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
Объект « Image » ( TCLImager ) хранит массив пикселей в 1D до 3D. Данные трехмерного вокселя также считаются типом трехмерного изображения . Класс 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
Объект Sampler ( TCLSamplr ) определяет метод интерполяции, чтобы получить цвет пикселя в реальных координатах.
Класс TCLSamplr генерируется с помощью класса TCLContex в качестве аргумента.
Object Pascal_Samplr := TCLSamplr.Create( _Contex );
Объект « Program » ( TCLProgra ) считывает исходный код и собирает его в исполняемый двоичный файл. Класс TCLProgra создается с классом TCLContex в качестве аргумента. Класс TCLProgra является абстрактным и служит базовым классом для классов TCLLibrar и TCLExecut , в зависимости от типа исходного кода.
Класс TCLLibrar - это программа, которая не включает функции для непосредственного выполнения, называется типом библиотеки.
Object Pascal_Librar := TCLLibrar.Create( _Contex ); _Librar.Source.LoadFromFile( ' Librar.cl ' ); // load Sourcecode
Класс TCLExecut - это программа, которая включает функции ( ядра 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 );
Объект ядра (см. Главу 2.8.) Автоматически создает класс TCLBuildr во время выполнения. Тем не менее, вы можете проверить на получение компиляции и связывания ошибок, создав объект TCLBuildr , прежде чем запустить ядро.
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
Объект « ядра » ( 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