【发布时间】:2012-10-15 03:59:30
【问题描述】:
这是我第一次在这里提问,所以提前非常感谢,请原谅我的无知。而且我刚刚开始 CUDA 编程。
基本上,我有一堆点,我想计算所有成对的距离。目前我的内核函数只保留一个点,并迭代地读取所有其他点(从全局内存),并进行计算。以下是我的一些困惑:
我使用的是具有 448 个内核的 Tesla M2050。但是我当前的并行版本(内核>>)实现了更高的并行度(比内核>>快约600倍)。可能是由于多线程问题或管道问题,还是它们实际上表示同一件事?
我想进一步提高性能。所以我想使用共享内存来为每个多处理块保存一些输入点。但新代码同样快。可能的原因是什么?会不会和我设置的线程太多有关?
或者,是因为我在代码中有一个 if 语句吗?问题是,我只考虑和计算短距离,所以我有一个类似的声明(如果 dist
一百万谢谢! 斌
【问题讨论】:
-
与前几代不同,Fermi 有一个自动缓存。您在 GPU 101 中学到的许多简单技巧都已过时。
-
消除分支的一个小技巧是:count += (distance
-
@Nathan:GPU 支持一种称为预测的系统。它允许 GPU 根据某些条件“预测”机器代码指令的执行。编译器使用它来避免在主体中仅包含几条指令的条件分支。
-
@misha 谢谢!您是否认为 Fermi 的自动缓存可能涵盖了引入共享内存的潜在好处是可以理解的?
-
@Nathan 非常感谢!棘手的部分是我需要使用一个数组来跟踪一堆计数器,而且只有一小部分距离具有 dist
标签: performance parallel-processing cuda