在MATLAB的早期版本中(例如R2013b),我有一个巧妙的技巧,我将一个监听器附加到一个轴句柄的YLim
属性,当轴y-limits被改变时它会通知我:
addlistener(gca, 'YLim', 'PreSet', @(src,ev_data) disp(ev_data.NewValue))
Run Code Online (Sandbox Code Playgroud)
我正在使用它来更新第二个数字,它会显示这些轴中可见数据子集的一些摘要统计数据.这太棒了!你放大,第二个数字自我更新.大.
使它成为一个PreSet
(而不是PostSet
)监听器是有用的,因为我可以检查新值是否与旧值相同,从而避免在不必要时重新计算这些统计信息.
但是,这在R2014b中不再适用于我.我能够附加事件监听器,但是当我触发事件时,我收到以下错误消息:
类event.PropertyEvent没有适当的方法,属性或字段NewValue.
我相信这与HG2图形系统有关.通过适当的断点,我们可以查看事件数据.在R2013b:
K>> ev_data
ev_data =
handle.PropertySetEventData
K>> get(ev_data)
Type: 'PropertyPreSet'
Source: [1x1 schema.prop]
AffectedObject: [1x1 axes]
NewValue: [0.5000 220.5000]
Run Code Online (Sandbox Code Playgroud)
在R2014b中,我们似乎错过了这个NewValue
领域:
K>> ev_data
ev_data =
PropertyEvent with properties:
AffectedObject: [1x1 Axes]
Source: [1x1 matlab.graphics.internal.GraphicsMetaProperty]
EventName: 'PreSet'
Run Code Online (Sandbox Code Playgroud)
它去哪儿了?!当然必须有一种方法来访问它.如果您无法访问要尝试将其设置为的新值,则属性预设事件处理程序有点无用.
我是数值线性代数的新手,我刚刚开始使用 LAPACK 和 BLAS。
是否有可以在打包存储和完整存储之间复制/转换对称矩阵的例程?
我发现了dtrttp
,我可以用它来将双精度全对称矩阵转换为压缩存储。但是,这些例程适用于三角形矩阵,因此相应的dtpttr
仅填充完整矩阵的三角形。我怎样才能填满另一半?
尝试使用nvvp
(或使用nvprof
)分析我的代码时,我得到了很多分析开销:
总时间为 98 毫秒,我在第一次内核启动时获得了 85 毫秒的“仪表”。
如何减少这种分析开销或仅放大我感兴趣的部分?
我在未选中“启用分析时开始执行”的情况下运行此程序,并且我使用cudaProfilerStart
/限制了分析,cudaProfilerStop
如下所示:
/* --- generate data etc --- */
// Call the function once to warm up the FFT plan cache
applyConvolution( T, N, stride, plans, yData, phiW, fData, y_dwt );
gpuErrchk( cudaDeviceSynchronize() );
// Call it once for profiling
cudaProfilerStart();
applyConvolution( T, N, stride, plans, yData, phiW, fData, y_dwt );
gpuErrchk( cudaDeviceSynchronize() );
cudaProfilerStop();
Run Code Online (Sandbox Code Playgroud)
applyConvolution()
我要分析的函数在哪里。
我在带有 GTX 1080 的 Ubuntu 16.04 上使用 CUDA …
blockIdx
线程块在 GPU 设备上执行的顺序和顺序有什么关系吗?
我的动机是我有一个内核,其中多个块将从全局内存中的同一位置读取,如果这些块可以并发运行会很好(因为 L2 缓存命中很好)。在决定如何将这些块组织到网格中时,是否可以肯定地说blockIdx.x=0
与 并发运行的可能性blockIdx.x=1
大于与blockIdx.x=200
?并且我应该尝试为从全局内存中的相同位置读取的块分配连续索引?
需要明确的是,我不是在询问块间依赖关系(如在这个问题中),并且从程序正确性的角度来看,线程块是完全独立的。我已经在使用共享内存在一个块内广播数据,我不能让这些块变得更大。
编辑:再次,我很清楚
线程块需要独立执行:必须可以以任何顺序并行或串行执行它们。
并且这些块是完全独立的——它们可以以任何顺序运行并产生相同的输出。我只是问我将块排列到网格中的顺序是否会影响哪些块最终并发运行,因为这确实会通过 L2 缓存命中率影响性能。