Microsoft DirectCompute es una interfaz de programación de aplicaciones (API) que admite la ejecución de núcleos de cómputo en computación de propósito general en unidades de procesamiento de gráficos en Windows Vista , Windows 7 y versiones posteriores de Microsoft. DirectCompute es parte de la colección de API de Microsoft DirectX y se lanzó inicialmente con la API de DirectX 11, pero se ejecuta en unidades de procesamiento de gráficos que usan DirectX 10 o DirectX 11. [1] La arquitectura de DirectCompute comparte una gama de interfaces computacionales con sus competidores: OpenCL de Khronos Group , sombreadores de cómputo en OpenGL y CUDA de NVIDIA .
La API DirectCompute ofrece capacidades multihilo mejoradas para aprovechar los recursos informáticos avanzados emergentes. [2] La API está diseñada para que las aplicaciones no gráficas accedan y utilicen los recursos de la GPU . [3]
El pipeline de cómputo es un tipo de pipeline de gráficos que se utiliza para enviar y ejecutar sombreadores de cómputo . Los pipelines de cómputo se ejecutan a través de listas de comandos de cómputo , que están restringidas a registrar solo comandos de copia y cómputo. Los sombreadores de cómputo se utilizan para algoritmos y cálculos de propósito general, y se ejecutan a través de procesadores paralelos en la GPU. Este modelo de ejecución paralela realizado por el pipeline de cómputo se organiza en un envío, grupos de subprocesos y subprocesos . El envío es un contenedor tridimensional de grupos de subprocesos, y un grupo de subprocesos es un contenedor tridimensional de subprocesos. [4] Los grupos de subprocesos se ejecutan en la GPU en oleadas. [5]
Esta canalización permite enviar fácilmente cargas de trabajo a la GPU sin necesidad de reestructurar todo el código de un programa. [6]
Una secuencia de procesamiento típica contiene una vista de recursos de sombreado de solo lectura como entrada, vistas de búfer constante para constantes de recursos adicionales y una vista de acceso desordenado para una salida. Es importante establecer los estados de los recursos para mejorar el rendimiento. [7]
La inicialización de la canalización de cómputo implica la creación de la firma raíz, la lectura del sombreador de cómputo y la creación del objeto de estado de la canalización.
// Establecer la firma raízCD3DX12_VERSIONED_ROOT_SIGNATURE_DESC firma_raíz_desc { 1 , parámetros raíz , 0 , punto nulo };// Serializar la firma raízMicrosoft :: WRL :: ComPtr < ID3DBlob > root_signature_blob { nullptr }; Microsoft :: WRL :: ComPtr < ID3DBlob > error_blob { nullptr }; D3DX12SerializeVersionedRootSignature ( & firma_raíz_desc , D3D_FIRMA_RAÍZ_VERSIÓN_1_1 , root_signature_blob . GetAddressOf (), error_blob . GetAddressOf () );// Crea la firma raízMicrosoft :: WRL :: ComPtr < ID3D12RootSignature > firma_raíz { nullptr }; dispositivo -> CreateRootSignature ( 0 , root_signature_blob -> GetBufferPointer (), root_signature_blob -> Obtener tamaño de búfer (), IID_PPV_ARGS ( firma_raíz . GetAddressOf ()));//Leer el sombreador de cálculoVentanas :: WRL :: ComPtr < ID3DBlob > calculate_shader { nullptr }; D3DReadFileToBlob ( L "C : /ruta/a/compute/shader" , calculate_shader.GetAddressOf ()) ; // Crear el objeto de estado de la canalización de cómputo (PSO)estructura PipelineStateStream { CD3DX12_FIRMA_RAÍZ_DE_ESTADO_DE_TUBERÍA_FLUJO_RAÍZ firma_raíz ; CD3DX12_TUBE_STATE_STREAM_CS computar_sombreador ; } flujo_de_estado_de_tubería ; // Establecimiento de la firma raíz y del sombreador de cómputo en el PSOpipeline_state_stream . firma_raíz = firma_raíz . Obtener (); pipeline_state_stream .compute_shader = CD3DX12_SHADER_BYTECODE { compute_shader .obtener ( ) }; D3D12_DESCRIPCIÓN_DE_FLUJO_DE_ESTADO_DE_LA_TUBERÍA descripción_de_flujo_de_estado_de_la_tubería { tamaño de ( PipelineStateStream ), y pipeline_state_stream }; // Crear estado de canalizacióndispositivo -> CreatePipelineState ( & descripción del flujo del estado de la tubería IID_PPV_ARGS ( flujo_de_estado_de_tubería . GetAddressOf ()));
Después de la inicialización de la canalización de cómputo, cada cuadro, se debe configurar el estado de la canalización, se debe configurar la firma de la raíz de cómputo y se ejecuta el envío.
lista_de_comandos -> SetPipelineState ( estado_de_tubería );lista_de_comandos -> SetComputeRootSignature ( firma_raíz );lista_de_comandos -> Despacho ( grupos_x , grupos_y , grupos_z );