NVIDIA PTX pokolenie i modyfikacje
Nie wiem, jak niski poziom jest ona w porównaniu do sprzętu (prawdopodobnie nieudokumentowanych?), Ale może być generowane z C/C++ - jak językach GPU, modyfikowane i ponownie wykorzystane w kilka sposobów:
OpenCL clGetProgramInfo(program, CL_PROGRAM_BINARIES
+ clCreateProgramWithBinary
: minimalny uruchamialny przykład: How to use clCreateProgramWithBinary in OpenCL?
są standaryzowane OpenC L API, które produkują i zużywają implementację zdefiniowanych formatów, które w wersji sterownika 375.39 dla Linuksa wydają się być czytelnymi dla człowieka PTX.
Możesz więc zrzucić PTX, zmodyfikować i przeładować.
nvcc
: można skompilować CUDA kod GPU-bocznego do ptx zespół prosto z albo:
nvcc --ptx a.cu
nvcc
można również przygotować OpenCL C programów zawierających zarówno urządzenia i kod hosta: Compile and build .cl file using NVIDIA's nvcc Compiler? ale nie mogłem znaleźć sposobu pobierz ptx z nvcc. Jaki ma sens, ponieważ jest to po prostu ciągi C + C, a nie magiczny C-zestaw. Jest to również sugerowane przez: https://arrayfire.com/generating-ptx-files-from-opencl-code/
I nie jestem pewien, jak skompilować zmodyfikowaną PTX i używać go tak jak ja z clCreateProgramWithBinary
: How to compile PTX code
Korzystanie clGetProgramInfo
, jądro CL wejściowe:
__kernel void kmain(__global int *out) {
out[get_global_id(0)]++;
}
zostanie skompilowany do pewnego PTX lubię:
//
// 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;
}
Następnie, jeśli na przykład zmodyfikować linię:
add.s32 %r3, %r2, 1;
do:
add.s32 %r3, %r2, 2;
i ponowne użycie PTX modyfikowane, to rzeczywiście zwiększa się o 2 zamiast 1, jak oczekiwano.
Masz link do deasemblera wydanego ostatnio przez nvidię? Wszystko, co uważam, to "decuda", która jest pracą niezależną; Myślałem, że nvidia nigdy nie wydała informacji o opkodach faktycznie zrozumianych przez ich sprzęt. –
Może być wydany tylko zarejestrowanym programistom, chociaż wydawało mi się, że zawiera go w najnowszym wydaniu CUDA. – zenna
To się nazywa cuobjdump – zenna