generazione NVIDIA PTX e la modifica
Non
sicuro di come basso livello che viene confrontato con l'hardware (probabilmente non documentato?), Ma può essere generato da C/C++ - come le lingue GPU, modificati e riutilizzati in alcuni modi:
OpenCL clGetProgramInfo(program, CL_PROGRAM_BINARIES
+ clCreateProgramWithBinary
: minimal esempio eseguibile: How to use clCreateProgramWithBinary in OpenCL?
Questi sono standardizzati OPENÇ L API, che producono e consumano formati definiti dall'implementazione, che nella versione driver 375.39 per Linux sembra essere PTX leggibile dall'uomo.
Quindi è possibile scaricare il PTX, modificarlo e ricaricarlo.
nvcc
: può compilare CUDA codice GPU-side per PTX montaggio semplice con:
nvcc --ptx a.cu
nvcc
può anche compilare i programmi OpenCL C contenenti sia dispositivo e il codice host: Compile and build .cl file using NVIDIA's nvcc Compiler? ma non riuscivo a trovare il modo di ottenere il ptx con nvcc. Che tipo di ha senso dal momento che si tratta di semplici stringhe C + C, e non di un superset C magico. Questo è suggerito anche da: https://arrayfire.com/generating-ptx-files-from-opencl-code/
E io non sono sicuro di come ricompilare il PTX modificato e utilizzarlo come ho fatto con clCreateProgramWithBinary
: How to compile PTX code
Utilizzando clGetProgramInfo
, un kernel di ingresso CL:
__kernel void kmain(__global int *out) {
out[get_global_id(0)]++;
}
viene compilato in una certa PTX piace:
//
// 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;
}
Quindi se per esempio si modifica la linea:
add.s32 %r3, %r2, 1;
a:
add.s32 %r3, %r2, 2;
e riutilizzare il PTX modificato, in realtà aumenta di 2 invece di 1 come previsto.
fonte
2017-04-09 09:05:20
Avete un collegamento per il disassemblatore recentemente rilasciato da nvidia? Tutto quello che trovo è "decuda" che è un'opera indipendente; Pensavo che nvidia non abbia mai rilasciato informazioni sugli opcode effettivamente capiti dal loro hardware. –
Può essere rilasciato solo agli sviluppatori registrati, anche se pensavo di averlo incluso nell'ultima versione di CUDA – zenna
Si chiama cuobjdump – zenna