为什么我的NVIDIA GPU上的OpenCL内存分配如此缓慢?

为什么我的NVIDIA GPU上的OpenCL内存分配如此缓慢?,opencl,gpu,gpgpu,Opencl,Gpu,Gpgpu,最近,在我们实验室重新启动GPU计算节点后,通过OpenCLAPI(使用clCreateBuffer())分配内存的成本似乎已经达到了顶点。我之前观察到,分配时间几乎与分配的字节数保持不变,但突然之间似乎存在着很强的相关性。例如,使用的基准测试程序,我曾在NVIDIA K40 GPU上获得以下结果: 1字节;平均值:382us;最小值:364us;马克斯:501us 2字节;平均值:376us;最小值:364us;最高:478美元 4字节;平均值:372us;最小值:364us;最高:474u

最近,在我们实验室重新启动GPU计算节点后,通过OpenCLAPI(使用
clCreateBuffer()
)分配内存的成本似乎已经达到了顶点。我之前观察到,分配时间几乎与分配的字节数保持不变,但突然之间似乎存在着很强的相关性。例如,使用的基准测试程序,我曾在NVIDIA K40 GPU上获得以下结果:


1字节;平均值:382us;最小值:364us;马克斯:501us
2字节;平均值:376us;最小值:364us;最高:478美元
4字节;平均值:372us;最小值:364us;最高:474us
8字节;平均值:375us;最小值:364us;马克斯:405美元
16字节;平均值:373us;最小值:364us;最高:407us
32字节;平均值:375us;最小值:365us;马克斯:404美国
64字节;平均值:375us;最小值:364us;最高:585us
128字节;平均值:376us;最小值:367us;最高:396美元
256字节;平均值:376us;最小值:364us;最高:395美元
512字节;平均值:373us;最小值:364us;马克斯:425美元
1024字节;平均值:371美元;最小值:365us;最大值:421U
2048字节;平均值:372us;最小值:364us;最高:472us
4096字节;平均值:372us;最小值:365us;最大值:411U
8192字节;平均值:371美元;最小值:364us;最高:394us
16384字节;平均值:371美元;最小值:364us;马克斯:403美元
32768字节;平均值:374us;最小值:365us;最大值:554us
65536字节;平均值:372us;最小值:364us;最高:407us
131072字节;平均值:371美元;最小值:365us;最高:393美元
262144字节;平均值:372us;最小值:364us;最高:394us
524288字节;平均值:372us;最小值:364us;马克斯:405美元
1048576字节;平均值:373us;最小值:364us;最高:482us
2097152字节;平均值:371美元;最小值:364us;最大值:391U
4194304字节;平均值:371美元;最小值:364us;最高:393美元
8388608字节;平均:380us;最小值:363us;最大值:487美元
16777216字节;平均值:372us;最小值:364us;最高:474us
33554432字节;平均值:371美元;最小值:365us;最大值:391U
67108864字节;平均值:373us;最小值:349us;最高:593us
134217728字节;平均值:372us;最小值:365us;最高:399美元
268435456字节;平均值:372us;最小值:365us;马克斯:410us
536870912字节;平均值:376us;最小值:364us;最高:473us

但是现在,使用相同的GPU和相同的CUDA版本(8.0),我得到了以下结果:


1字节;平均:136us;最小:127us;最高:367us
2字节;平均:133us;最小:127us;马克斯:147美元
4字节;平均:134us;最小:128us;马克斯:155美元
8字节;平均:133us;最小:128us;马克斯:153us
16字节;平均:133us;最小:128us;最高:149美元
32字节;平均:132us;最小:128us;马克斯:145美元
64字节;平均:133us;最小:128us;马克斯:153us
128字节;平均值:143us;最小:132us;最大值:371U
256字节;平均:138us;最小:133us;最大值:170us
512字节;平均:138us;最小:133us;马克斯:157us
1024字节;平均:140美国;最小:133us;马克斯:164美元
2048字节;平均:141us;最小:133us;最高:273us
4096字节;平均:138us;最小:133us;最高:158美元
8192字节;平均:138us;最小:132us;马克斯:155美元
16384字节;平均:139us;最小:132us;马克斯:178美元
32768字节;平均:139us;最小:133us;最高:156us
65536字节;平均:139us;最小:133us;马克斯:173us
131072字节;平均:138us;最小:132us;马克斯:157us
262144字节;平均:138us;最小:127us;马克斯:442us
524288字节;平均:134us;最小:127us;马克斯:279美元
1048576字节;平均:134us;最小:127us;马克斯:264us
2097152字节;平均:227us;最小值:144us;马克斯:239us
4194304字节;平均值:424us;最小值:214us;最高:436us
8388608字节;平均值:819us;最小值:409us;最高:849美元
16777216字节;平均:1606us;最小值:815us;最高:1625美元
33554432字节;平均值:3181美元;最小:1610us;最大值:3211U
67108864字节;平均:6377us;最小值:3239us;最高:6423us
134217728字节;平均:12693us;最小值:6421us;最高:12772us
268435456字节;平均值:2533US;最小值:12789us;最大值:25593us
536870912字节;平均:50606us;最小值:25512us;最高:50975us

我在我们实验室的其他GPU(GTX 780Tis和Titan Black)上也有类似的行为,它们都有RHEL 7.4和CUDA 8。我同意分配规模和时间之间的某种关系,但这些时间似乎也很荒谬。50ms用于分配500MiB?我有一台家用机器,运行Fedora 26和CUDA 8,带有NVIDIA GTX 770,在那里我得到了以下结果:


1字节;平均:269us;最小值:156us;最高:574us
2字节;平均:286us;最小:140us;最高:510us
4字节;平均:271美元;最小值:156us;最高:595美元
8字节;平均值:272us;最小:163us;最高:563us
16字节;平均:171us;最小:152us;最大值:325美元
32字节;平均:178美国;最小:148us;最大值:301U
64字节;平均:171us;最小值:156us;最高:387美元
128字节;平均:171us;最小值:150us;马克斯:315美元
256字节;平均:163us;最小值:150us;马克斯:470美元
512字节;平均值:175us;最小:148us;最高:350美元
1024字节;平均:173us;最小:155us;最大值:471U
2048字节;平均:172us;最小:151us;最高:286us
4096字节;平均:177美国;最小:148us;最大值:401美元
8192字节;平均:188美国;最小值:156us;最高:527us
16384字节;平均:177美国;min:147us;最高:407us
32768字节;平均:167us;最小:151us;马克斯:506us
65536字节;平均:174美国;最小值:145us;最高:294us
131072字节;平均:166us;最小值:150us;最高:406us
262144字节;平均:173us;最小:163us;最高:276us
524288字节;平均:172us;最小:152us;最大值:431U
1048576字节;平均:180美国;最小值:150us;最高:423us
2097152字节;平均:170us;最小值:150us;最大值:391U
4194304字节;平均:171us;min:162us;马克斯:238美元
8388608字节;平均:182us;min:157us;最大值:420us
16777216字节;平均:167us;min:159us;最高:225us
33554432字节;平均:188美国;min:164us;最高:539美元
67108864字节;平均:200us;最小:180us;马克斯:403美元
134217728字节;平均:269us;最小:234us;最高:478美元
268435456字节;平均:333美国;最小值:300us;最高:610us
536870912字节;平均值:495us;最小值:455us;最高:719美元

这对我来说似乎更合理。行为的改变与我所知道的任何软件更新都不一致,但与所有重新启动的机器一致。一个可能重要的区别是