【问题标题】:cufftPlan2d exception spend a long time to executecufftPlan2d 异常执行时间长
【发布时间】:2017-08-01 07:18:15
【问题描述】:

我正在使用 cufft 库。我正在使用 cufftPlan2d 函数来创建我需要的计划。以下是我的代码:

cudaEvent_t start1,stop1;
    cudaEventCreate(&start1);
    cudaEventCreate(&stop1);
    cudaEventRecord(start1, 0);

    cufftHandle plan1;
    cufftPlan2d(&plan1,HEIGHT2,WIDTH2,CUFFT_C2C);
    cudaEventRecord(stop1,0);
    cudaEventSynchronize(stop1);
    float etime;
    cudaEventElapsedTime(&etime,start1,stop1);

其中 HEIGHT2=1080*2,WIDTH2=1920*2。但是etime=919.542419ms,时间太长了,怎么做才能减少时间?

【问题讨论】:

  • 我想你实际上是在问你第一次打电话给cufftPlan2d?
  • @talonmies :实际上,我在调用 cufftPlan2d 之前调用了内核。像这样:lut_kernel>>(a,b,c);当lut_kernel完成后,执行cufftPlan2d(&plan1,HEIGHT2,WIDTH2,CUFFT_C2C)
  • 但是是 first cufftPlan2d 调用吗?
  • @talonmies:是的。

标签: cuda


【解决方案1】:

第一次调用 cuda 命令时会发生很多初始化。这是因为 cuda 使用延迟初始化,有关如何捕获它,请参阅 talonmies 之前的答案 here

引用Nvidia forums:

CUDA 使用延迟初始化。如果您想确保函数 xyz 的所有必要初始化都已完成,唯一确定的方法是调用函数 xyz。之后,如果再次调用 xyz,应该没有初始化开销。

对于 CUDA,在第一次调用设备内存分配器(如 cudaMalloc)后,应该完成大量初始化。

对于像 CUFFT 这样的库,在调用任何调用设备内核的库函数(例如任何 cufft exec 调用)后,应该完成大量初始化。

【讨论】:

  • 嗯,是的,这就是 why (但请注意,您链接到的答案已过时,甚至管理上下文初始化的“正确、现代”方式也不会极大地影响被询问的行为)。但是关于第一次调用时初始化时间长的做什么的问题呢?
  • "您无法减少开销,这是驱动程序、运行时和操作系统延迟的函数。"来自您的旧帖子,我应该将其添加到我的帖子中吗?
  • 创建袖口计划会做一些独立于 CUDA 上下文初始化并且需要时间的事情。延迟的来源不是上下文建立
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多