我使用Phytec的飞思卡尔i.MX6Q主板。在它上运行一个基于yocto / poky的操作系统,使用内核3.19.5和一些i.MX IPU和v4l2以及媒体总线驱动程序。
我的问题是我想加速UYVY转换。尝试各种技术(MT,opencv OCL,Neon,......)。使用4个线程的基于标准整数的转换需要640x480图像的4到8ms和1920x1080的17-25ms。但前提是我将v4l2缓冲区复制到用户空间缓冲区(上面没有包含的时间)。如果我直接从v4l2缓冲区转换到某个用户空间缓冲区,则需要大约4-8倍的时间。这表示此缓冲区可能未缓存(L2)。所以我进一步挖掘并发现mmaped缓冲区由vb2 dma例程分配,这些例程使用dma_alloc_coherent,而dma_alloc_coherent又分配缓冲区,只有BUFFERABLE标志。根据我的理解,这意味着它不使用缓存吗?
问题是,在这种情况下,一旦缓冲区出列,硬件将永远不会写入该缓冲区并完成任何先前的操作而我也不会这样做,所以在我排队之前不缓存缓冲区是没有意义的它回来了。
由于你不能强制从用户空间缓存,我想到使用用户指针作为缓冲区。但据我所知,尽管驱动程序说它支持用户指针,但IPU DMA(IDMAC)不支持分散和收集,这意味着在这种情况下,内存需要在物理上连续(并且页面/缓存对齐) 。这又是一个问题,因为只有"驱动程序"可以分配连续的缓冲区。我唯一记得的驱动程序/ api就是cmem。
还有其他一些使用缓存的方法,我还没有想到或者我忽略了什么?
祝你好运