我需要通过在不同场景下测试它们的吞吐量来测试一些 GPU。
这包括一个简单的 64b 乘法:
__device__ void add(unsigned int *data, bool flag){
unsigned int index = threadIdx.x;
unsigned int result;
asm ("{\n\t"
"add.cc.u32 %1, %1, %1;\n\t"
"addc.u32 %0, 0, 0;\n\t"
"}"
: "=r"(result), "+r"(index): );
if(flag)
data[threadIdx.x] = result;
}
64b 模数:
__device__ void mod(){
asm ("{\n\t"
".reg .u64 t1;\n\t"
"cvt.u64.u32 t1, %0;\n\t"
"rem.u64 t1, t1, t1;\n\t"
"}"
: : "r"(index));
}
和 64b mul+mod:
__device__ void mulmod
asm ("{\n\t"
".reg .u64 t1;\n\t"
".reg .u64 t2;\n\t"
"mul.wide.u32 t1, %0, %0;\n\t"
"cvt.u64.u32 t2, %0;\n\t"
"rem.u64 t1, t1, t2;\n\t"
"}"
: : "r"(index));
}
我认为任何内存访问对我的意图都是完全没用的,我想使用线程索引变量作为输入。
而且由于我要在没有寄存器上写,所以我不需要关心寄存器的使用,我可以启动尽可能多的线程(每个 GPU 允许)
我想知道:
如果这是正确的方法
除了最大化线程数之外,是否有任何特定的线程配置可以检索到最佳吞吐量?