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.
¿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. –
Puede ser lanzado a desarrolladores registrados solamente, aunque pensé que lo incluyeron en la última versión de CUDA – zenna
Se llama cuobjdump – zenna