xxxxxzz123 2020-03-21 14:50 采纳率: 0%
浏览 279

我的这段CUDA代码为何运行时间这么慢?

代码功能:使用CUDA计算一个二维图片的像素,每个像素点分配一个线程。
那么按道理运行的时间跟图片大小没关系吧,因为我为每个像素都安排了一个线程

dim3 blocks((WIDTH + THREAD_NUM - 1) / THREAD_NUM, (LENGTH + THREAD_NUM - 1) / THREAD_NUM);
    dim3 threads(THREAD_NUM, THREAD_NUM);

    global_findTheClosestSite<< <blocks, threads >> >(dthis);

    __device__  void CPolyVoronoi::device_findTheClosestSite()
{

    int x = threadIdx.x + blockIdx.x*blockDim.x;
    int y = threadIdx.y + blockIdx.y*blockDim.y;
    int offset = x + y*blockDim.x*gridDim.x;

    float minDis;
    int closestSite;
    if (offset<WIDTH*LENGTH)
    {
         minDis = 100000;
         closestSite = 0;
         CUDA::point p(pix[offset].centerPt);
         int ns = numOfSites;
         float currentDis;
        for (size_t k = 0; k < ns; ++k)
        {
             currentDis=pTop_distance3d(dseeds[k], p);
            if (currentDis < minDis)
            {
                minDis = currentDis;
                closestSite = k;
            }
        }
        colorOfPixel[offset] = closestSite;
    }
}

实际情况是,处理200*200的数据需要10s,而50*50只用0.5s。这是为什么呢?

  • 写回答

2条回答 默认 最新

  • threenewbee 2020-03-21 14:55
    关注

    gpu可以同时运行的线程不是无限多的,当然时间和数据规模有关。
    而且gpu不擅长if判断,尽量把它放在外面。

    评论

报告相同问题?

悬赏问题

  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥15 comsol仿真压阻传感器