我想知道如何逐步在 GPU 中生成高负载。我正在尝试做的是一个程序,它将最大负载放入 MP,然后在其他中,直到达到 MP 总数。
这类似于在 CPU 的每个内核中执行"虽然为真",但我不确定相同的范式是否适用于具有 CUDA 的 GPU。
你可以帮我吗?
如果要进行压力测试/功耗测试,则需要选择工作负载。仅计算代码的最高功耗,您最有可能通过一些综合基准测试获得,这些基准测试为 GPU 提供最佳组合和操作顺序。否则,BLAS 级别 3 可能非常接近最佳。
仅将负载放在一定数量的多处理器上需要调整工作负载以限制块级并行性。
简而言之,这就是我要做的:
- 选择一个经过良好优化且已知可以在很大程度上利用 GPU 的代码(高 IPC、高功耗等)。在CUDA开发人员论坛上环顾四周,您应该能够找到手动调整的BLAS代码或类似的东西。
- 更改代码以强制其在给定数量的多处理器上运行。这将要求您调整块和线程的数量,以便为要使用的处理器数量产生恰到好处的负载量。
- 配置文件:探查器计数器可以向您显示每个多处理器的指令量,从而检查您是否确实仅在所需数量的处理器上运行,以及其他可以指示代码运行效率的计数器。以及
- 量。如果你有一辆特斯拉或Quadro,你可以开箱即用。否则,请尝试 nvml 修复。如果没有功率测量,您将很难知道您离 TDP 有多远,尤其是 GPU 节流的天气。
我的一些基准测试通过 CUDA、OpenMP 和编程多线程执行相同的计算。执行的算术运算的形式为 x[i] = (x[i] + a) * b - (x[i] + c) * d + (x[i] + e) * f 在每个数据元素上加 2、8 或 32 个加法或减法和乘法。还使用了一系列数据大小。[免费]Linux的基准测试,源代码和结果通过我的页面:
http://www.roylongbottom.org.uk/linux%20benchmarks.htm
我也提供Windows品种。以下是一些 CUDA 结果,显示使用 GeForce GTX 650 的最大速度为 412 GFLOPS。在四核/8线程Core i7上,OpenMP使用SSE指令产生高达91 GFLOPS,多线程高达93 GFLOPS,使用AVX 1产生178 GFLOPS。另请参阅老化和可靠性应用程序部分,其中最苛刻的 CUDA 测试在 CPU 压力测试的同时运行一段时间以显示温度升高。
Core i7 4820K 3.9 GHz Turbo Boost GeForce GTX 650
Linux CUDA 3.2 x64 32 Bits SP MFLOPS Benchmark 1.4 Tue Dec 30 22:50:52 2014
CUDA devices found
Device 0: GeForce GTX 650 with 2 Processors 16 cores
Global Memory 999 MB, Shared Memory/Block 49152 B, Max Threads/Block 1024
Using 256 Threads
Test 4 Byte Ops Repeat Seconds MFLOPS First All
Words /Wd Passes Results Same
Data in & out 100000 2 2500 0.837552 597 0.9295383095741 Yes
Data out only 100000 2 2500 0.389646 1283 0.9295383095741 Yes
Calculate only 100000 2 2500 0.085709 5834 0.9295383095741 Yes
Data in & out 1000000 2 250 0.441478 1133 0.9925497770309 Yes
Data out only 1000000 2 250 0.229017 2183 0.9925497770309 Yes
Calculate only 1000000 2 250 0.051727 9666 0.9925497770309 Yes
Data in & out 10000000 2 25 0.369060 1355 0.9992496371269 Yes
Data out only 10000000 2 25 0.201172 2485 0.9992496371269 Yes
Calculate only 10000000 2 25 0.048027 10411 0.9992496371269 Yes
Data in & out 100000 8 2500 0.708377 2823 0.9571172595024 Yes
Data out only 100000 8 2500 0.388206 5152 0.9571172595024 Yes
Calculate only 100000 8 2500 0.092254 21679 0.9571172595024 Yes
Data in & out 1000000 8 250 0.478644 4178 0.9955183267593 Yes
Data out only 1000000 8 250 0.231182 8651 0.9955183267593 Yes
Calculate only 1000000 8 250 0.053854 37138 0.9955183267593 Yes
Data in & out 10000000 8 25 0.370669 5396 0.9995489120483 Yes
Data out only 10000000 8 25 0.202392 9882 0.9995489120483 Yes
Calculate only 10000000 8 25 0.049263 40599 0.9995489120483 Yes
Data in & out 100000 32 2500 0.725027 11034 0.8902152180672 Yes
Data out only 100000 32 2500 0.407579 19628 0.8902152180672 Yes
Calculate only 100000 32 2500 0.113188 70679 0.8902152180672 Yes
Data in & out 1000000 32 250 0.497855 16069 0.9880878329277 Yes
Data out only 1000000 32 250 0.261461 30597 0.9880878329277 Yes
Calculate only 1000000 32 250 0.060132 133042 0.9880878329277 Yes
Data in & out 10000000 32 25 0.375882 21283 0.9987964630127 Yes
Data out only 10000000 32 25 0.207640 38528 0.9987964630127 Yes
Calculate only 10000000 32 25 0.054718 146204 0.9987964630127 Yes
Extra tests - loop in main CUDA Function
Calculate 10000000 2 25 0.018107 27613 0.9992496371269 Yes
Shared Memory 10000000 2 25 0.007775 64308 0.9992496371269 Yes
Calculate 10000000 8 25 0.025103 79671 0.9995489120483 Yes
Shared Memory 10000000 8 25 0.008724 229241 0.9995489120483 Yes
Calculate 10000000 32 25 0.036397 219797 0.9987964630127 Yes
Shared Memory 10000000 32 25 0.019414 412070 0.9987964630127 Yes