Enlace del curso: https://www.bilibili.com/video/BV1zC4y1s7Ax/?spm_id_from=333.337.search-card.all.click&vd_source=23174149881549c431809ba9bd3acade
Introducción a OpenCL
Arquitectura informática OpenCL
Soporte multiplataforma
Configuración del entorno
Referencia:
[1] https://blog.csdn.net/Ciellee/article/details/122379217
También puede usar vcpkg para instalar el entorno opencl. vcpkg es un administrador de paquetes de C++, que puede instalar y administrar fácilmente bibliotecas de terceros de C++ .
vcpkg install opencv:x64-windows
Información de plataforma de salida compatible con OpenCL local
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cassert>
#include <CL/cl.h>
using namespace std;
// 检查返回值错误
#define CHECK_ERRORS(ERR) \
if(ERR != CL_SUCCESS){
\
cerr << "OpenCL error code" << ERR \
<< "file: " << __FILE__ \
<< "line: " << __LINE__ \
<< ".\nExiting..." << endl; \
exit(1); \
}
int main(int argc, const char** argv)
{
cl_int err = CL_SUCCESS;
// 1. 获取当前设备所有支持OpenCL的平台的数量
cl_uint num_of_platforms = 0;
err = clGetPlatformIDs(0, 0, &num_of_platforms);
CHECK_ERRORS(err);
// 2. 获取当前设备所有支持OpenCL的平台的信息
cl_platform_id* platforms = new cl_platform_id[num_of_platforms];
err = clGetPlatformIDs(num_of_platforms, platforms, 0);
CHECK_ERRORS(err);
cout << "Platform info: \n";
// 3. 打印平台信息
for (cl_uint i = 0; i < num_of_platforms; i++)
{
// 获取平台字符串的长度
size_t platform_name_length = 0;
err = clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, 0, 0, &platform_name_length);
CHECK_ERRORS(err);
// 获取平台字符串
char* platform_name = new char[platform_name_length];
err = clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, platform_name_length, platform_name, 0);
CHECK_ERRORS(err);
cout << " [" << i << "] " << platform_name << endl;
}
return 0;
}
Esto es lo que produce mi PC:
Platform info:
[0] NVIDIA CUDA
[1] Intel(R) OpenCL HD Graphics
Capítulo 2 Programación de host: estructuras de datos básicas
2.1 Tipos de datos básicos
- OpenCL es un conjunto de herramientas multiplataforma, por lo que requiere una serie de tipos de datos básicos acordados como soporte.
- La declaración de tipos de datos está en CL/cl_platform.h. Estos datos son solo redefiniciones de los tipos de datos de c/c++.
2.2 Obtener información de la plataforma
Ejemplos de escenarios de aplicación:
- Hay varios dispositivos disponibles, debe especificar el dispositivo informático
- Al publicar un programa, especifique el dispositivo según la plataforma de hardware del usuario.
- Utilice cl_platform_id para corresponder a las dos situaciones anteriores
2.2.1 Crear estructura de plataforma
Cada cl_platform_id corresponde a una implementación (plataforma) específica diferente de OpenCL instalada en el host.
Escribir un programa de plataforma se divide en dos pasos:
- Asigne espacio de memoria para una o más estructuras cl_platform_id
- Llame a clGetPlatformID para inicializar estas estructuras de datos. Su firma de función es la siguiente:
clGetPlatformIDs(
cl_uint num_entries,
cl_platform_id * platforms,
cl_uint * num_platforms);
Hay tres puntos a tener en cuenta sobre esta función:
- Esta función no devuelve cl_platform_id . Devuelve 0 cuando tiene éxito. Devolver un número negativo indica que la detección falló.
- La función real de la función es colocar cl_platform_id en el espacio de memoria al que apuntan las plataformas.
- Guarde la cantidad de plataformas disponibles usando num_platforms , que refleja el límite superior de la cantidad de plataformas disponibles.
- num_entries indica el límite superior de la cantidad de plataformas que desea detectar.
- dirección de memoria del objeto de plataformas
escenas a utilizar
// 1. 获取当前设备所有支持OpenCL的平台的数量
cl_uint num_of_platforms = 0;
err = clGetPlatformIDs(0, 0, &num_of_platforms);
CHECK_ERRORS(err);
// 2. 获取当前设备所有支持OpenCL的平台的信息
cl_platform_id* platforms = new cl_platform_id[num_of_platforms];
err = clGetPlatformIDs(num_of_platforms, platforms, 0);
CHECK_ERRORS(err);
clGetPlatformIDs se llama dos veces aquí
- La primera llamada obtiene el número de plataformas soportadas num_of_platforms
- La segunda llamada obtiene la dirección de memoria de la plataforma, similar a handle
2.2.2 Obtener información de la plataforma
API:
clGetPlatformInfo(cl_platform_id platform,
cl_platform_info param_name,
size_t param_value_size,
void * param_value,
size_t * param_value_size_ret)
- dirección de memoria del dispositivo de plataforma
- parámetros relacionados con la información de la plataforma param_name
2.3 Acceso a los equipos de instalación
Luego de acceder a la plataforma del fabricante, podrá acceder a cada dispositivo conectado a la plataforma. El complejo de dispositivos acepta tareas y datos distribuidos desde el host. El dispositivo en el programa está representado por la estructura cl_device_id . Esta sección se centra en examinar dos funciones del dispositivo OpenCL.
- clGetDeviceIDS
- clGetDeviceInfo
2.3.1 Crear estructura de dispositivo
Antes de enviar el kernel al dispositivo, necesitamos crear una estructura cl_device_id para representar un dispositivo. Esto se puede lograr mediante
clGetDeviceIDs . Guardará la estructura correspondiente al dispositivo OpenCL en la matriz de tipo cl_device_id, y su firma de función es la siguiente: