Поиск…


замечания

В этом разделе представлен обзор того, что такое opencl, и почему разработчик может захотеть его использовать.

Следует также упомянуть о любых крупных предметах в opencl и ссылаться на связанные темы. Поскольку Documentation for opencl является новым, вам может потребоваться создать начальные версии этих связанных тем.


Opencl - это api, который ставит gpus, cpus и некоторые другие ускорители (например, pcie-fpga) в хорошее использование C99-подобных вычислений, но с очень широким преимуществом параллелизма. После завершения установки и базовой реализации только простые изменения в строке ядра (или ее файле) автоматически применяются алгоритм для N аппаратных потоков.

Разработчик может захотеть использовать его, потому что будет намного проще оптимизировать пространство памяти или скорость, чем делать то же самое на opengl или direct-x. Кроме того, он является бесплатным. Параллелизм внутри устройства является неявным, поэтому нет необходимости в явной многопоточности для каждого устройства. Но для конфигураций с несколькими устройствами требуется многопоточность cpu. Например, когда 1000 потоковое задание отправляется на процессор, синхронизация потоков обрабатывается драйвером. Вы просто говорите, насколько большой должна быть рабочая группа (например, 256, каждая из которых связана с виртуальной локальной памятью) и где точки синхронизации (только при необходимости).

Использование gpu для операций общего назначения почти всегда быстрее, чем cpu. Вы можете быстрее сортировать, умножать матрицы на 10 раз быстрее и оставлять таблицы sql в памяти в режиме «нет». Любой 200-долларовый gpu для настольных компьютеров быстрее закончит работу с физикой (жидкостью с конечным элементом), чем любые 200 $ cpu. Opencl упрощает и переносит работу. Когда вы закончите работу на C #, вы можете легко перейти к реализации java-opencl с использованием тех же ядер и проекта C ++ (из-за использования JNI с дополнительной компиляцией на C ++).

Для графической части вам не всегда приходится отправлять буферы между процессором и gpu. Вы можете работать исключительно на gpu, используя опцию «interop» в части создания контекста. С помощью interop вы можете подготовить геометрии при предельных значениях gpu. Для любых данных вершин не требуется pci-e. Только «команда» отправляется, и работа выполняется только внутри графической карты. Это означает, что для данных не требуется cpu-накладные расходы. Opencl готовит данные геометрии, opengl делает это. CPU освобождается. Например, если один поток процессора может построить 32x32 вершинную сферу в 10000 циклов, тогда gpu с opencl может построить 20 сфер за 1000 циклов.


Что такое OpenCL?

OpenCL не подходит для Open C omputing L anguage. OpenCL - это платформа для параллельного программирования на гетерогенных платформах, называемых вычислительными устройствами , от процессоров до графических процессоров до более специальных платформ, таких как FPGA. OpenCL предоставляет стандартный интерфейс для параллельных вычислений на этих вычислительных устройствах, но также параллелизм между устройствами. Он определяет язык программирования на основе C99 и минимальные требования к базовым функциям, реализованным на устройствах с поддержкой OpenCL. OpenCL, кроме того, описывает абстрактную вычислительную и запоминающую модели, как можно более общую, чтобы упростить повторное использование кода между различными платформами.

Предпосылки

Если у вас в вашем компьютере имеется современный процессор или графическая карта (GPU), возможно, у вас есть все готовое для первых шагов в OpenCL. Выяснение, может ли ваш процессор работать с OpenCL, обычно делается с домашней страницы производителя, хорошим первым началом является официальная документация на

https://www.khronos.org/conformance/adopters/conformant-products#opencl

Что такое OpenCL?

Открытый язык вычислений (OpenCL) - это среда для написания программ, выполняемых на процессорах, графических процессорах и других параллельных процессорах и ускорителях.

OpenCL определяет язык программирования (на основе C), который обеспечивает доступ к названной памяти на кристалле, модель для параллельного выполнения задач и возможность синхронизации этих задач.

Реализация C # OpenCL 1.2: количество платформ для системы AMD в 64-битных окнах

OpenCL - это низкоуровневый api, поэтому он должен быть реализован сначала в «C-пространстве». Для этого нужно загружать файлы заголовков с сайта Khronos. Мое оборудование - это AMD и способное к версии 1.2, загрузка

opencl.h 
cl_platform.h 
cl.h 
cl_ext.h 
cl_egl.h 
cl_dx9_media_sharing.h 
cl_d3d10.h 
cl_d3d11.h 
cl_gl.h 
cl_gl_ext.h 
cl.hpp

с этой страницы

должно быть достаточно для привязок C ++, поэтому после добавления этих файлов в ваш проект и установки правильных двоичных (и библиотечных) файлов (например,

$ (AMDAPPSDKROOT) \ lib \ x86_64 для 64-разрядной библиотеки amd (предпочтительны библиотеки sdk приложения amd)

,

C: \ Windows \ SysWOW64 для 64-разрядного файла opencl.dll (.so, если ICD имеет систему Linux)

например, но отличается от Intel-Nvidia), вы можете начать запрашивать список платформ (amd, intel, xilinx, nvidia) после установки правильных драйверов (таких как малиновый для amd). Драйверы для запуска приложения opencl (с использованием ICD), библиотеки и файлы заголовков для разработки должны быть короткими.

Чтобы запросить платформы:

#define __CL_ENABLE_EXCEPTIONS
#include "stdafx.h"
#include <vector>
#include <CL/cl.hpp>

extern "C"
    {
       // when this class is created, it contains a list of platforms in "platforms" field.
       class OpenClPlatformList
       {
           public:
               std::vector<cl::Platform> platforms;
               int platformNum;
               OpenClPlatformList()
               {
                   platforms= std::vector< cl::Platform>();
                   cl::Platform::get(&platforms);
                   platformNum= platforms.size();
               }
        };


        // this is seen from C# when imported. Creates an object in memory.
        __declspec(dllexport)
            OpenClPlatformList * createPlatformList()
        {
            return new OpenClPlatformList();
        }

        __declspec(dllexport)
            int platformNumber(OpenClPlatformList * hList)
        {
            return hList->platformNum;
        }


        __declspec(dllexport)
            void deletePlatformList(OpenClPlatformList * p)
        {
            if (p != NULL)
                delete p;
            p = NULL;
        }


    }

может быть встроен в dll (например, OCLImplementation.dll)

и использовать его со стороны C #,

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;


namespace WrapperCSharp
{
    public class WrapperCSharp
    {
        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr createPlatformList();

        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern int platformNumber(IntPtr hList);

        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern void deletePlatformList(IntPtr hList);
    }
}

конечно же, dll должен быть замечен проектом C #, просто поставив его рядом с исполняемым проектом, решает его.

Теперь, если образец компьютера имеет по крайней мере одну платформу, совместимую с opencl,

IntPtr platformList = createPlatformList(); // just an address in C-space
int totalPlatforms = platformNumber(platformList); // AMD+NVIDIA systems should have "2"
deletePlatformList(platformList); //

переменная totalPlatforms должна иметь как минимум значение «1». Затем вы можете использовать переменную platform в C-пространстве, используя дополнительные функции для итерации по всем платформам для запроса всех устройств, таких как CPU, GPU и ускорители специального назначения, такие как phi или некоторые fpga.

Один из них не просто записывает все эти C ++ в C # обертки для критически важных проектов. Существует много оболочек, написанных для C #, Java и других языков. Для java существует «Aparapi», который является «java байт-кодом для opencl-c» конвертера api, который берет то, что вы пишете исключительно в java, в gpu-параллельную версию «на лету», поэтому он несколько портативен.

OpenCL и C #

Для C # существует множество оболочек, которые предлагают интерфейс для взаимодействия с OpenCL.

  • OpenCL.NET: это одна из самых обтекателей самого низкого уровня. Он предлагает полную реализацию OpenCL API для C # без добавления абстракции вообще. Поэтому примеры C \ C ++ легко переносятся для этой библиотеки. Единственная страница проекта в настоящее время находится на codeplex, которая закрывается на 15.12.2017, но пакет доступен на NuGet

https://openclnet.codeplex.com/

  • NOpenCL: эта библиотека предлагает абстрактный интерфейс между C # и OpenCL.

Краткосрочная цель - обеспечить простой в использовании абстрактный слой, который обеспечивает доступ к полной возможности OpenCL без ущерба для производительности.

https://github.com/tunnelvisionlabs/NOpenCL

  • Cloo:

Cloo - это простая в использовании, управляемая библиотека с открытым исходным кодом, которая позволяет приложениям .NET / Mono полностью использовать возможности OpenCL.

https://sourceforge.net/projects/cloo/



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow