gpt4 book ai didi

opencv - Jetson TK1上的O​​penCV比自定义Cuda代码慢得多

转载 作者:行者123 更新时间:2023-12-02 16:49:34 25 4
gpt4 key购买 nike

我正在Jetson TK1上开发OpenCV应用程序。我正在使用NVIDIA提供的OpenCV4Tegra软件包。

dpkg -l输出:

ii  libopencv4tegra                                       2.4.10.1                                            armhf        OpenCV4Tegra
ii libopencv4tegra-dev 2.4.10.1 armhf OpenCV4Tegra
ii libopencv4tegra-repo 2.4.10.1 armhf OpenCV4Tegra

我试图了解Jetson可以为我的应用程序提供的加速。

我已经测试过将数据从主机复制到设备。

OpenCV代码:
cv::Mat src_host = cv::imread("image.png");
cv::gpu::GpuMat src;
src.upload(src_host);

我已将上传调用置于循环中并对其计时。通常平均约为10毫秒。

当我尝试类似的Cuda代码时:
cv::Mat src_host = cv::imread("image.png");
int nb_bytes = src_host.rows*src_host.cols*src_host.elemSize1();
uchar* data;
cudaMalloc(&data, nb_bytes);
cudaMemcpy(data, src_host.data, nb_bytes, cudaMemcpyHostToDevice);

这段代码平均大约需要50-100us。

当我尝试像这样的OpenCV操作时:
cv::gpu::GaussianBlur(src, dst, cv::Size(25, 25), 0);

这也比自定义Cuda实现花费了一个数量级。

我使用OpenCV的gpu功能不正确吗?我做错了假设吗?

最佳答案

如果使用nvvp启动代码,则可以在设备上执行的每个操作之后看到opencv调用cudaDeviceSynchronize。

为了避免这些同步,您必须通过创建gpu::Stream来使用其异步API,并将您的操作启动到流中。

不要忘记在所有内核调用之后都进行同步。

您还可以注意到,对于某些操作(erode / dilate / GaussianBlur / ...),第一次调用的时间要比其他时间长,以避免在设备初始化期间可以一次调用它们,以便正确地对代码进行基准测试刚过。

关于opencv - Jetson TK1上的O​​penCV比自定义Cuda代码慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com