NVIDIA PTX Generation und Modifikation
Nicht sicher, wie niedriges Niveau an die Hardware verglichen wird (wahrscheinlich ohne Papiere?), Aber es kann von C erzeugt werden/C++ - wie GPU Sprachen, modifiziert und wiederverwendet in ein paar Möglichkeiten:
OpenCL clGetProgramInfo(program, CL_PROGRAM_BINARIES
+ clCreateProgramWithBinary
: minimal runnable Beispiel: How to use clCreateProgramWithBinary in OpenCL?
Dies sind standardisierte OpenC L-APIs, die implementation-definierte Formate erzeugen und konsumieren, die in Treiber-Version 375.39 für Linux zufällig lesbare PTX-Dateien sind.
So können Sie die PTX dump, ändern und neu laden.
nvcc
: kann CUDA GPU-Seite Code kompilieren Baugruppe ptx einfach mit entweder:
nvcc --ptx a.cu
nvcc
kann OpenCL C-Programme auch beide Gerät und dem Host-Code enthält kompilieren: Compile and build .cl file using NVIDIA's nvcc Compiler? aber ich konnte nicht finden, wie man Holen Sie den PTX mit nvcc heraus. Welche Art von Sinn macht es, da es nur einfache C + C-Strings und kein magischer C-Supersatz ist. Dies wird auch durch vorgeschlagen: https://arrayfire.com/generating-ptx-files-from-opencl-code/
Und ich bin nicht sicher, wie die modifizierte PTX neu kompilieren und es verwenden, wie ich mit clCreateProgramWithBinary
tat: How to compile PTX code
clGetProgramInfo
verwenden, einen Eingang CL-Kernel:
__kernel void kmain(__global int *out) {
out[get_global_id(0)]++;
}
wird bis zu einem gewissen PTX zusammengestellt mag:
//
// 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;
}
Dann, wenn zum Beispiel die Zeile ändern:
add.s32 %r3, %r2, 1;
zu:
add.s32 %r3, %r2, 2;
und Wiederverwendung der PTX geändert, erhöht er tatsächlich um 2 statt 1 wie erwartet.
Haben Sie einen Link für den Disassembler, der kürzlich von nvidia veröffentlicht wurde? Alles, was ich finde, ist "Decuda", was eine unabhängige Arbeit ist; Ich dachte, dass nvidia nie Informationen über die Opcodes veröffentlicht hat, die tatsächlich von ihrer Hardware verstanden werden. –
Es kann nur für registrierte Entwickler freigegeben werden, obwohl ich dachte, sie enthalten es in der neuesten CUDA Release – zenna
Es heißt cuobjdump – zenna