【发布时间】:2012-05-15 00:10:01
【问题描述】:
我在代码中对 float* 内存块进行了一些计算。由于我正在处理图像,因此我必须使用宽度 * 高度点和 180 次旋转来执行此操作。我正在启动 180 个线程(每度旋转 1 个),因为这是代码中唯一可并行化的过程。 我旋转图像,并为每次旋转获取每个点的结果浮点值。 我有另一个 float* 块,它存储每个点的当前最大值。
if(resultMap[i] < convrst)
{
resultMap[i] = convrst;
rMap[i] = (unsigned char)r0;
oMap[i] = (unsigned char)index;
}
使用 resultMap 存储当前的最大值。 convrst 是卷积的结果,如果当前结果高于之前的结果,则保存该值,加上该点的半径(r0)和旋转(索引)。 r0 最初是一个 int,以及索引。 i 是一个从 0 到 imgsize-1 的计数器
如果没有 { } 部分中的分配,整个代码将在 2 秒内完成,而分配则需要 50 秒(这还没有考虑到我在该代码中省略了锁以避免同步问题) .
为什么这段代码这么慢,我该怎么做才能让它更快完成?
【问题讨论】:
-
你在什么 GPU 上运行它?
-
这是一台配备 Core i5-2410M 和 GeForce GT 540M 的笔记本电脑
-
你运行内核的块有多少? 180 个线程是要使用的很小(并且是错误的)线程数,即使对于像 GT 540M 这样的 2 SM GPU 也是如此
标签: cuda