我有一个简单的CUDA内核,用于计算1000字节片段中A的数量
一个非常大的字符串。布局数据库以便进行内存访问
聚结。从内核返回后,我的main函数复制了设备
数组results
到主机上的一个进行进一步分析。
__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {
unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
float A = 0; int i; char ch;
if(id < jobs_todo) {
for(i = 0; i < 1000; i += 1){
ch = database[jobs_todo*i + id];
if(ch == 'A') A++;
}
results[id] = A;
}
内核运行正常。但是,如果我用一些微不足道的东西替换results[id]=A
results[id]=10
或者只是注释掉它运行得更快(10次)和
使用--ptxas-options=-v
给出的寄存器少得多。内核没有帮助
如果我注释掉那条线。 CUDA编译器是否通过查看传递来了解这一点
参数?它选择什么都不做?
答案 0 :(得分:3)
您所看到的是编译器优化的结果。编译将修剪“死”代码,即不直接导致内存写入的代码。所以你的内核
__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {
unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
float A = 0; int i; char ch;
if(id < jobs_todo) {
for(i = 0; i < 1000; i += 1){
ch = database[jobs_todo*i + id];
if(ch == 'A') A++;
}
results[id]=10;
}
有效优化
__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {
unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
results[id]=10;
}
显然,缩减代码的寄存器占用空间和执行时间远低于完整代码。您可以通过将代码编译为PTX并检查发出的代码来确认这一点。