2011-01-11 10 views
17

¿Alguien tiene experiencia en crear/manipular códigos de máquina GPU, posiblemente en tiempo de ejecución?¿Cómo crear o manipular el ensamblador de GPU?

Estoy interesado en modificar el código de ensamblador de la GPU, posiblemente en tiempo de ejecución con una sobrecarga mínima. Específicamente, estoy interesado en la programación genética basada en ensambladores.

Entiendo que ATI ha publicado ISA para algunas de sus tarjetas, y nvidia recientemente lanzó un desensamblador para CUDA para tarjetas antiguas, pero no estoy seguro de si es posible modificar instrucciones en memoria en tiempo de ejecución o incluso antes.

¿Esto es posible? Cualquier información relacionada es bienvenida.

+0

¿Tiene un enlace para el desensamblador lanzado recientemente por nvidia? Todo lo que encuentro es "decuda", que es un trabajo independiente; Pensé que nvidia nunca divulgó información sobre los códigos de operación realmente entendidos por su hardware. –

+0

Puede ser lanzado a desarrolladores registrados solamente, aunque pensé que lo incluyeron en la última versión de CUDA – zenna

+1

Se llama cuobjdump – zenna

Respuesta

3
+1

La mayoría de los enlaces están muertos. – paulotorrens

1

OpenCL está hecho para ese propósito. Usted proporciona un programa como una cadena y posiblemente compila en tiempo de ejecución. Vea los enlaces provistos por otro afiche.

+0

Por lo que yo sé, OpenCL se compila en el momento de la instalación primero en el lenguaje intermedio IL (similar al PTX de NVidia) y luego se compila correctamente en las instrucciones de la máquina. Son las instrucciones de la máquina que me interesan. – zenna

+0

No, puedes compilar OpenCL sobre la marcha con una cadena como la que escribí. – kriss

2

En la API del controlador CUDA, el module management functions permite que una aplicación cargue en tiempo de ejecución un "módulo", que es (más o menos) un archivo PTX o cubin. PTX es el idioma intermedio, mientras que cubin es un conjunto de instrucciones ya compilado. cuModuleLoadData() y cuModuleLoadDataEx() parecen ser capaces de "cargar" el módulo desde un puntero en la RAM, lo que significa que no se requiere ningún archivo.

Así que su problema parece ser: ¿cómo construir mediante programación un módulo de cubos en la RAM? Hasta donde yo sé, NVIDIA nunca dio a conocer detalles sobre las instrucciones realmente entendidas por su hardware. Sin embargo, hay un paquete de código abierto independiente llamado decuda que incluye "cudasm", un ensamblador de lo que la GPU NVIDIA "anterior" entiende ("más antiguo" = GeForce 8xxx y 9xxx). No sé cuán fácil sería integrar en una aplicación más amplia; está escrito en Python.

GPU NVIDIA más nuevos usan un conjunto de instrucciones distintas (qué tan distintas, no sé), por lo que un cubin para una antigua GPU ("capacidad informática 1.x" en terminología NVIDIA/CUDA) puede no funcionar en un GPU (capacidad informática 2.x, es decir, "arquitectura Fermi" como GTX 480). Por eso es preferible usar PTX: un archivo PTX determinado será portátil a través de las generaciones de GPU.

2

que he encontrado gpuocelot de código abierto (licencia BSD) proyecto interesante.

Es "un marco de compilación dinámico para PTX". Yo lo llamaría traductor de cpu.

"Ocelot actualmente permite que los programas CUDA se ejecuten en GPU NVIDIA, GPU AMD y CPU x86".Hasta donde yo sé, este marco de trabajo hace un flujo de control y análisis de flujo de datos en Kernel PTX para aplicar transformaciones apropiadas.

-3

generación de NVIDIA PTX y modificación

No

seguro de cómo bajo nivel que se compara con el hardware (probablemente indocumentado?), Pero puede ser generada a partir de C/C++ - como los lenguajes de la GPU, modificados y reutilizados en algunas de las formas:

  • OpenCL clGetProgramInfo(program, CL_PROGRAM_BINARIES + clCreateProgramWithBinary: mínima ejemplo ejecutable: How to use clCreateProgramWithBinary in OpenCL?

    Estos son estandarizados OpenC L API's, que producen y consumen formatos de implementación definidos, que en el controlador versión 375.39 para Linux pasa a ser PTX legible para el ser humano.

    Para poder descargar el PTX, modificarlo y volver a cargarlo.

  • nvcc: puede compilar CUDA código del lado del GPU para PTX montaje simple, ya sea con:

    nvcc --ptx a.cu 
    

    nvcc también puede compilar programas OpenCL C que contengan tanto del dispositivo como código de host: Compile and build .cl file using NVIDIA's nvcc Compiler? pero no pude encontrar la manera de saca el ptx con nvcc. ¿Qué tipo de sentido tiene? Ya que solo se trata de cadenas C + C, y no de un superconjunto C mágico. Esto también es sugerido por: https://arrayfire.com/generating-ptx-files-from-opencl-code/

    y no estoy seguro de cómo volver a compilar el PTX modificado y usarlo como lo hice con clCreateProgramWithBinary: How to compile PTX code

Usando clGetProgramInfo, un núcleo de entrada CL:

__kernel void kmain(__global int *out) { 
    out[get_global_id(0)]++; 
} 

se compila a algunos les gusta PTX:

// 
// Generated by NVIDIA NVVM Compiler 
// 
// Compiler Build ID: CL-21124049 
// Cuda compilation tools, release 8.0, V8.0.44 
// Based on LLVM 3.4svn 
// 

.version 5.0 
.target sm_20 
.address_size 64 

    // .globl _Z3incPi 

.visible .entry _Z3incPi(
    .param .u64 _Z3incPi_param_0 
) 
{ 
    .reg .pred %p<2>; 
    .reg .b32 %r<4>; 
    .reg .b64 %rd<5>; 


    ld.param.u64 %rd1, [_Z3incPi_param_0]; 
    mov.u32  %r1, %ctaid.x; 
    setp.gt.s32 %p1, %r1, 2; 
    @%p1 bra BB0_2; 

    cvta.to.global.u64 %rd2, %rd1; 
    mul.wide.s32 %rd3, %r1, 4; 
    add.s64  %rd4, %rd2, %rd3; 
    ldu.global.u32 %r2, [%rd4]; 
    add.s32  %r3, %r2, 1; 
    st.global.u32 [%rd4], %r3; 

BB0_2: 
    ret; 
} 

Entonces, si por ejemplo se modifica la línea:

add.s32  %r3, %r2, 1; 

a:

add.s32  %r3, %r2, 2; 

y reutilizar el PTX modificado, en realidad se incrementa en 2 en vez de 1 como se esperaba.

+0

@Downvoters por favor explique para que pueda aprender y mejorar ;-) –

+1

https://pastebin.com/yRMVGs4D – talonmies

+1

@talonmies ¡GRACIAS por sus comentarios! La compilación de OpenCL requiere el programa C real, al igual que para CUDA. Ver: http://stackoverflow.com/questions/13062469/compile-and-build-cl-file-using-nvidias-nvcc-compiler/43298903#43298903 Sin embargo, me equivoqué al decir que puedes extraer el 'ptx' con 'nvcc' para OpenCL, solo funciona para CUDA (estaba probando demasiadas cosas al mismo tiempo). 'clGetProgramInfo' estaba trabajando todo el tiempo, exactamente como se dijo. He actualizado la respuesta explicando esos puntos más claramente y la he recuperado. Avíseme si encuentra algo mal con eso. –

Cuestiones relacionadas