我正在阅读 Cheng 等人的《专业 CUDA C 编程》。并且有一些示例说明如何运行(非常简单的单行)内核,例如,<<<1024, 512>>>性能比<<<2048, 256>>>. 然后他们(多次)声明您可能已经预料到了这个结果,因为第二次运行有更多的块,因此暴露了更多的并行性。但我不明白为什么。并行度不是由 SM 中并发扭曲的数量决定的吗?块大小与此有什么关系 - 这些扭曲属于哪个块并不重要 - 相同的块或不同的块,那么为什么使用较小的块会暴露更多的并行性(相反,如果块大小太小我会达到每个 SM 的最大块限制,从而导致并发扭曲更少)?我能想象的唯一场景是 Fermi 上的 1024 个线程块 = 32 个扭曲,每个 SM 限制最多有 48 个并发扭曲。这意味着只有 1 个并发块,并且只有 32 个并发扭曲是可能的,从而减少了并行量,但这是一个非常具体的用例。
更新:发布后我想到的另一件事是:在块中的所有扭曲完成之前,不能将其从 SM 中驱逐。因此,在该块执行结束时,可能会出现这样的情况:最后几个“最慢”的扭曲将整个块保留在 SM 中,而该块中的大部分扭曲已完成并停止,但不能再创建新的块。加载直到那几个正在执行的扭曲完成。所以这种情况下效率就变低了。现在,如果块更小,那么这种情况仍然会发生,但是相对于执行扭曲的停滞数量更小,因此效率更高。是这个吗?
我有一个大程序,它使用我为每个线程分配的所有寄存器(64)并溢出到本地内存.我希望能够告诉编译器哪些变量应该不惜一切代价保留在寄存器中,以及哪些变量我并不关心."注册"C/C++关键字是否在nvcc中有效?是否有不同的机制?
谢谢!
我正在Qt(5)中开发一个应用程序,基本上我正在尝试使用QtMultimedia5将相同的视频源渲染到窗口中的2个位置.我在QML中这样做,但如果有一个C++解决方案,我会乐意实现它.
我在窗口中显示视频没有问题.当我尝试使用相同的QMediaSource但将其渲染到2个窗口/控件上时,问题就开始了.
我看到的是调用QMediaService :: requestControl,它返回一个QVideoRendererControl对象.然后调用QVideoRendererControl :: setSurface来设置它呈现视频的表面.因此,从我收集的内容来看,QMediaService在任何给定时间都有一个表面呈现视频.
如何渲染到2个或更多曲面?还有其他课程能更好地满足我的需求吗?
干杯