找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 47|回复: 3

从显存中拷贝数据到内存中cpu过高

[复制链接]
发表于 2017-7-13 17:24:22 | 显示全部楼层 |阅读模式
ESC4000G3
两路720P的视频解码,只解码不从显存中拷贝数据cpu在4%左右,但是从显存中把数据拷贝到内存中cpu就到了30%左右,请问下我的cpu占用率为什么会这么高,以下是我从显存中拷贝数据的代码, 我的cpu是i7的,内存8G, 系统ubuntu16.04界面版的
   assert(pUserData);
    CudaDecoder* pDecoder = (CudaDecoder*)pUserData;
    CCtxAutoLock lck(pDecoder->m_ctxLock);
    CUVIDPROCPARAMS oVideoProcessingParameters;
    memset(&oVideoProcessingParameters, 0, sizeof(CUVIDPROCPARAMS));
    CUdeviceptr pDecodedFrame = 0;
    unsigned int nDecodedPitch = 0;
    CUresult oResult = cuvidMapVideoFrame(pDecoder->m_videoDecoder, pPicParams->picture_index, &pDecodedFrame, &nDecodedPitch, &oVideoProcessingParameters);
    unsigned int nv12_size = nDecodedPitch * (pDecoder->m_oVideoDecodeCreateInfo.ulHeight + pDecoder->m_oVideoDecodeCreateInfo.ulHeight / 2);  // 12bpp  
    if (pDecoder->m_bufferSize <= nv12_size) {
        if (pDecoder->m_cacheFrameBuffer)
        {
            cuMemFreeHost((void*)pDecoder->m_cacheFrameBuffer);;
            pDecoder->m_cacheFrameBuffer = NULL;
        }
        cuMemAllocHost((void**)&pDecoder->m_cacheFrameBuffer, nv12_size);
        pDecoder->m_bufferSize = nv12_size;
    }
    oResult = cuMemcpyDtoH(pDecoder->m_cacheFrameBuffer, pDecodedFrame, nv12_size);
    oResult = cuvidUnmapVideoFrame(pDecoder->m_videoDecoder, pDecodedFrame);
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
Jetson TX2
cuvid没用过,里面应该使用了内核进行mapped memory之间的数据传输,因此导致了较高的cpu实用率
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
Tesla P100
sisiy 发表于 2017-7-17 13:47
cuvid没用过,里面应该使用了内核进行mapped memory之间的数据传输,因此导致了较高的cpu实用率

谢谢,这个问题已经解决了,是我的内存分配和释放的问题,每一帧yuv的数据都分配和释放内存,这样cpu开销就大了,现在改成用一块固定的buffer从显卡中拷贝YUV数据,cpu就降下来了
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
302678068 发表于 2017-7-18 11:20
谢谢,这个问题已经解决了,是我的内存分配和释放的问题,每一帧yuv的数据都分配和释放内存,这样cpu开销就大 ...

谢谢分享经验 :)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表