我一直在玩一个访问7个全局内存缓冲区的OpenCL内核,对值做一些事情并将结果存储回第8个全局内存缓冲区.正如我所观察到的,随着输入大小的增加,L1缓存未命中率(=未命中(未命中+命中))变化很大.我找不到这种变化的来源.此处的输入大小表示全局工作项的数量(2的幂和工作组大小的倍数).工作组大小的数量仍为256.
这些是结果.这些显示了L1缓存未命中率.从4096个工作项(16个工作组)开始.
0.677125
0.55946875
0.345994792
0.054078125
0.436167969
0.431871745
0.938546224
0.959258789
0.952941406
0.955016479
Run Code Online (Sandbox Code Playgroud)
分析器说它每个线程使用18个寄存器.这是代码(函数TTsum()应该只做一堆依赖的超越操作,所以它与缓存无关)我猜:
float TTsum(float x1, float x2, float x3, float x4, float x5, float x6, float x7)
{
float temp = 0;
for (int j = 0; j < 2; j++)
temp = temp + x1 + (float)x2 + x3 + x4 + x5 + x6 + x7;
temp = sqrt(temp);
temp = exp(temp);
temp = temp / x1;
temp = temp / (float)x2;
for (int j = 0; …Run Code Online (Sandbox Code Playgroud) 据我所知,GPU在warp之间切换以隐藏内存延迟.但我想知道在哪种条件下,经线会被切换掉?例如,如果warp执行加载,并且数据已经存在于缓存中.那么warp是否已经关闭或继续下一次计算?如果连续两次添加会发生什么?谢谢
我的机器上有3个GTX Titan GPU.我使用cifar10_train.py运行Cifar10中提供的示例并获得以下输出:
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0: Y N
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1: N Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0) …Run Code Online (Sandbox Code Playgroud) 每当我运行cifar10_eval.py时,在创建32个线程时如下:
I tensorflow/core/common_runtime/local_device.cc:25]本地设备intra op parallelism threads:32
我认为这个线程数是在CPU上运行的线程数,但是当我检查使用情况时,只使用了400-500%的CPU.反正有没有改变这个线程数?
我有一个关于GPU中分支预测的问题.据我所知,在GPU中,它们通过分支进行预测.
例如,我有一个这样的代码:
if (C)
A
else
B
Run Code Online (Sandbox Code Playgroud)
因此,如果A需要40个周期而B需要50个周期来完成执行,如果假设一个warp,A和B都被执行,那么完成这个分支需要总共90个周期吗?或者它们是否重叠A和B,即,当执行A的某些指令时,等待内存请求,然后执行B的某些指令,然后等待内存,依此类推?谢谢
我有一个关于x86架构中的差异缓存级别的缓存未命中之间的关系的问题(Say Xeon X5660).
我在一些性能计数器上对OpenCL应用程序(Blackscholes)进行了一些分析.对于每个计数器,我总结所有核心上的所有值并获得此结果:
instructions #: 493167746502.000000
L3_MISS #: 1967809.000000
L1_MISS #: 2344383795.000000
L2_DATA_MISS #: 901131.000000
L2_MISS #: 1397931.000000
memory loads #: 151559373227.000000
Run Code Online (Sandbox Code Playgroud)
问题是为什么L3未命中数量大于L2未命中数?(我不断多次重新进行分析,差异不大).我的想法基本上是:
L2未命中= L3命中+ L3未命中
有人可以解释我这里出了什么问题,我有没有想念?
更进一步,是什么原因导致CPU的最后一级缓存(CPU)的缓存读取?它只是L2中的数据丢失吗?
谢谢
我对GPU如何执行同步有一些疑问.据我所知,当一个warp遇到障碍时(假设它在OpenCL中),并且它知道同一组的其他warp还没有到达那里.所以它必须等待.但是在等待时间里,这种扭曲到底是做什么的呢?它仍然是一个活跃的扭曲?或者它会做某种空操作?
我注意到,当我们在内核中进行同步时,指令数量会增加.我想知道这个增量的来源是什么.同步是否分解为许多较小的GPU指令?或者因为空闲的warp会执行一些额外的指令?
最后,我如果同步增加的成本,比起一个没有同步强烈怀疑,(比方说屏障(CLK_LOCAL_MEM_FENCE))是由经纱在工作组(或threadblock)的数量的影响?谢谢
我想创建一个适用于 AMD GPU(Fury Nano)的 OpenCL 内核。基本上我想使用 OpenCL 编写内核草案,并使用 OpenCL API 使用 clGetProgramInfo 输出汇编代码。然后我将修改汇编代码并使用 clcreateprogramwithbinary 将其加载回程序。
有没有可能的方法来做到这一点?
我对GPU上运行的内核的吞吐量有疑问.假设其占用率为0.5,块大小为256:编程指南指出最好有多个块,以便它们可以隐藏内存延迟等.但我不明白为什么这是正确的.因为只要内核每个流多处理器有多个warp = 24,即3个块,它就会达到峰值吞吐量.因此,具有超过24个warp(或3个块)将不会改变吞吐量.
我错过了什么吗?任何人都能纠正我吗?
在查看NVIDIA Fermi架构中性能计数器的名称(cuda doc文件夹中的文件Compute_profiler.txt)时,我注意到对于L2缓存未命中,有两个性能计数器,l2_subp0_read_sector_misses和l2_subp1_read_sector_misses。他们说这些是用于两片 L2 的。
为什么他们有两片 L2?与流式多处理器架构有什么关系吗?这种划分对性能有什么影响?
谢谢