小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

时间:2021-10-30 07:32:37
贴出部分代码:
QueryPerformanceCounter(&start_t);

d_detectJunction<<<gridSize,blockSize>>>(dev_DenoidedOut,dev_gaborKernel,width,height,gaborW,Thr2,dev_Juntion);

        cudaDeviceSynchronize();

cudaStatus = cudaFree(dev_gaborKernel);
cudaStatus = cudaFree(dev_DenoidedOut);

QueryPerformanceCounter(&stop_t);
exe_time = 1e3*(stop_t.QuadPart-start_t.QuadPart)/freq.QuadPart;
totalTime += exe_time;
fprintf(stdout, "4、 executed time with CUDA is %fms.\n", exe_time);
谢谢大家!

15 个解决方案

#1


大家帮忙看看,自顶

#2


怎么判断得到是cudaFree()耗时多的呢?

#3


貌似是我搞错了 , 计时的时候未同步.谢谢你的回答!对了你知道例子里面cudaopenmp怎么用嘛?好像那个程序openmp并没有发挥作用啊!

#4


引用 2 楼 Spidey212 的回复:
怎么判断得到是cudaFree()耗时多的呢?
貌似是我搞错了 , 计时的时候未同步.谢谢你的回答!对了你知道例子里面cudaopenmp怎么用嘛?好像那个程序openmp并没有发挥作用啊!

#5


那个例子是用openmp在host端实现多线程并行,每个CPU线程对应一个GPU设备
omp_set_num_threads(num_gpus);  // create as many CPU threads as there are CUDA devices

只有一个GPU时就相当于串行程序了。
    #pragma omp parallel
    {
             //...
    }

大括号中的内容可以理解为CUDA的kernel函数

#6


Quote: 引用 5 楼 Spidey212 的回复:

这个例子里面不是有多个cpu对应一个GPU的例子吗,为什么最后只是做了串行?

#7


小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#8


引用 7 楼 zj19930505 的回复:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

用的2*num_gpus还是不行的话就是你的环境没有配置好,必须加上支持openmp的编译选项

#9


方法:项目属性->CUDA Runtime API->Host->Extra C++ options
添加 /openmp ,然后重新编译就好了,如图:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#10


引用 9 楼 Spidey212 的回复:
方法:项目属性->CUDA Runtime API->Host->Extra C++ options
添加 /openmp ,然后重新编译就好了,如图:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?
谢谢您的回答,我一直在找个,可是就是没找到。下面是截图 小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#11


CUDA C/C++ 里应该有是否使用OpenMP的选项

#12


引用 11 楼 Spidey212 的回复:
CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。

#13


引用 12 楼 zj19930505 的回复:
Quote: 引用 11 楼 Spidey212 的回复:

CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。
没必要非得勾上那个选项,只需要手动添加编译命令/openmp 到你的command line里面就行

#14


引用 13 楼 Spidey212 的回复:
Quote: 引用 12 楼 zj19930505 的回复:

Quote: 引用 11 楼 Spidey212 的回复:

CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。
没必要非得勾上那个选项,只需要手动添加编译命令/openmp 到你的command line里面就行
好久没来看,问题的解决办法正如您说的那样,价格命令行就可以了.谢谢您!请问您对流并行(多GPU核同时运行)熟悉 吗?

#15


不熟,最近也需要做这方面的,慢慢学习中

#1


大家帮忙看看,自顶

#2


怎么判断得到是cudaFree()耗时多的呢?

#3


貌似是我搞错了 , 计时的时候未同步.谢谢你的回答!对了你知道例子里面cudaopenmp怎么用嘛?好像那个程序openmp并没有发挥作用啊!

#4


引用 2 楼 Spidey212 的回复:
怎么判断得到是cudaFree()耗时多的呢?
貌似是我搞错了 , 计时的时候未同步.谢谢你的回答!对了你知道例子里面cudaopenmp怎么用嘛?好像那个程序openmp并没有发挥作用啊!

#5


那个例子是用openmp在host端实现多线程并行,每个CPU线程对应一个GPU设备
omp_set_num_threads(num_gpus);  // create as many CPU threads as there are CUDA devices

只有一个GPU时就相当于串行程序了。
    #pragma omp parallel
    {
             //...
    }

大括号中的内容可以理解为CUDA的kernel函数

#6


Quote: 引用 5 楼 Spidey212 的回复:

这个例子里面不是有多个cpu对应一个GPU的例子吗,为什么最后只是做了串行?

#7


小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#8


引用 7 楼 zj19930505 的回复:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

用的2*num_gpus还是不行的话就是你的环境没有配置好,必须加上支持openmp的编译选项

#9


方法:项目属性->CUDA Runtime API->Host->Extra C++ options
添加 /openmp ,然后重新编译就好了,如图:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#10


引用 9 楼 Spidey212 的回复:
方法:项目属性->CUDA Runtime API->Host->Extra C++ options
添加 /openmp ,然后重新编译就好了,如图:
小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?
谢谢您的回答,我一直在找个,可是就是没找到。下面是截图 小弟请问:为什么我的cuda程序在cudaFree()特别耗时间呢?程序设计是不是不合理?

#11


CUDA C/C++ 里应该有是否使用OpenMP的选项

#12


引用 11 楼 Spidey212 的回复:
CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。

#13


引用 12 楼 zj19930505 的回复:
Quote: 引用 11 楼 Spidey212 的回复:

CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。
没必要非得勾上那个选项,只需要手动添加编译命令/openmp 到你的command line里面就行

#14


引用 13 楼 Spidey212 的回复:
Quote: 引用 12 楼 zj19930505 的回复:

Quote: 引用 11 楼 Spidey212 的回复:

CUDA C/C++ 里应该有是否使用OpenMP的选项
找不到cuda runtime API,那里面才有支持openMP的选项。
没必要非得勾上那个选项,只需要手动添加编译命令/openmp 到你的command line里面就行
好久没来看,问题的解决办法正如您说的那样,价格命令行就可以了.谢谢您!请问您对流并行(多GPU核同时运行)熟悉 吗?

#15


不熟,最近也需要做这方面的,慢慢学习中