【OpenCL】Notas del curso

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

Insertar descripción de la imagen aquí

Soporte multiplataforma
Insertar descripción de la imagen aquí

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++.
    Insertar descripción de la imagen aquí

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
    Insertar descripción de la imagen aquí

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:


Supongo que te gusta

Origin blog.csdn.net/qq_30340349/article/details/131370312
Recomendado
Clasificación