统计一条cuda ld指令需要经过哪些硬件单元--演示CuAssembler如何修改CUDA SASS指令
背景:想统计一条ld指令需要经过哪些硬件单元
步骤:
- cuda Kernel里只包含一条load指令,但如果没有st会被编译器优化掉(ptx还在,但sass里却没了)
- 暂时没有找到编译选项关掉该优化
- 于是采用CuAssembler将ST SASS指令删掉,重新生成fatbin
- 采用cuModuleLoad加载fatbin,用cuLaunchKernel运行该Kernel
1.准备SASS反汇编工具CuAssembler
git clone https://github.com/cloudcores/CuAssembler
export PATH=${
PATH}:$PWD/CuAssembler/bin:/usr/local/cuda/bin/
export PYTHONPATH=${PYTHOPATH}:$PWD/CuAssembler/
pip install pyelftools
2.仅包含ld.global.cv.f32的cuda kernel,如果不加st指令,编译器会将ld指令也优化掉。后面手动修改汇编指令删除掉st指令
tee ptx_ld_inst.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
__global__ void ptx_ld_inst_kernel(float *input, float *out) {
float d;
int tid = threadIdx.x + blockIdx.x * blockDim.x;
asm("ld.global.cv.f32 %0, [%1];" : "=f"(d) : "l"(&input[tid]));
asm("st.global.wt.f32 [%0],%1;" :: "l"(&out[tid]),"f"(d));
}
EOF