我有兴趣获得在 GeForce GTX 550 Ti 上执行 1 个双精度 FLOP 所需的纳秒数。
为了做到这一点,我遵循以下方法:我发现该卡的单精度峰值性能为 691.2 GFLOPS,这意味着双精度峰值性能将是它的 1/8,即 86.4 GFLOPS。然后,为了获得每个核心的 FLOPS,我将 86.4 GFLOPS 除以核心数量 192,得到每个核心 0.45 GFLOPS。 0.45 GFLOPS 表示每个核心每纳秒 0.45 FLOPS。如果我遵循正确的方法,那么我想知道每个核心运行多少个线程来获取这些 GFLOPS 数字以及在哪里可以找到此信息?
此外,我的小测试如下所示,仅通过一个线程执行 236000232 个周期。为了找到执行循环 1 次迭代所需的时间(以纳秒为单位),我执行了 236000232/10^6 = 236 个周期。该卡的着色器时钟为 1800Mhz,这意味着执行一次循环迭代需要 236/1.8 = 131 纳秒。这个数字比上面的数字大得多(每个核心 0.45 纳秒)。我确信我在这里遗漏了一些东西,因为数字非常不同。请帮助我理解其背后的数学原理。
__global__ void bench_single(float *data)
{
int i;
double x = 1.;
clock_t start, end;
start = clock();
for(i=0; i<1000000; i++)
{
x = x * 2.388415813 + 1.253314137;
}
end = clock();
printf("End and start %d - %d\n", end, start);
printf("Finished in %d cycles\n", end-start);
}
谢谢你,
计算能力 2.1 设备的双精度吞吐量为每周期 4 次操作(如果执行 DFMA,则为 8 次)。这假设所有 32 个线程在分派的 warp 中都处于活动状态。
4 个操作/周期/SM * 4 个 SM * 1800 MHz * 2 个操作/DFMA = 56 GFLOPS 双
该计算假设扭曲中的所有线程都处于活动状态。
您问题中的代码包含两个可以融合到 DFMA 中的相关操作。使用 cuobjdump -sass 检查程序集。如果您在同一个 SM 上启动多个 warp,则测试将变成对相关指令吞吐量而不是延迟的测量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)