本文测试cuda trap指令对warp的影响
1.测试方法
- 分别测试smsp上不同的warp数,并且在指定上tid上执行__trap指令,看看对其它线程的影响
2.测试小结
- 如果32*4个线程(每个smsp只有一个warp),所有的线程并行执行,tid==32+16执行__trap后Kernel就退出了,kernel out这一行不会打印
- 如果是3244个线程(每个smsp有4个warp),他们轮流调度,所以在tid==32+16执行__trap之前 kernel out这一行打印有机会被调度,会打印出来
- 所在,不管哪一个线程只要执行到__trap kernel就退出,没有执行到的线程正常运行,如果带着cuda-gdb,则会收到SIGTRAP
- cuda kernel里执行到assert(0)或_brkpt()或__trap(),lanuch失败,之后的cudaMemcpy,cudaFree调用也会失败(也就得不到设备内存的数据)
3.测试步骤
tee trap_inst_benchmark.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <assert.h>
#include <cstdio>
#include <cuda.h>
#define CHECK_CUDA(call) \
do {
\
cudaError_t err = call; \
if (err != cudaSuccess) {
\
std::cerr << "CUDA error at " << __FILE__ << ":" << __LINE__; \
std::cerr << " code=" << err << " (" << cudaGetErrorString(cudaGetLastError()) << ")" << std::endl; \
} \
} while