我通过千兆位以太网接口从相机获取数据。因为数据很小,我想把这个直接放到L1缓存中(而不是DRAM),这样处理速度很快。
我怎样才能做到这一点?有没有为此的编译器指令?
平台信息
Windows 7、Intel Core2Duo、Visual Studio 2010、C/C++、OpenCV。
在具有大缓存的高端计算机中,性能不会有显着提高。
在图像太大而无法完全加载到缓存中并且许多算法要在同一个图像上运行大量次的情况下,可能会提高性能。在这种情况下,图像的一部分被加载到缓存并在其上运行算法,然后复制其余部分并继续运行。这种情况可以很容易地在 Beagleboard 等具有 32kb L1 缓存的嵌入式设备中重现。在这种情况下,可以通过有效地分割图像并在加载图像的下一部分之前在图像的一部分上运行所有进程来提高算法的性能。
Gcc 将为 -O1 -O2 -O3 的数组数据生成数据预取指令。这一切都是最近重新设计的。因此,_DATAPREFETCH 标志不太可能比标准优化级别提供任何改进。
至于绕过内存,如何为数据分配缓存标签?缓存标签在内存获取时发出,cpu 通过它的缓存标签在缓存中找到数据。
DuoCore 共享一个标签总线,我相信 GPU 可以挂起标签总线,所以我们可以设想一个 I/O 控制器这样做,但我还没有找到参考。你的千兆卡在哪个插槽?
(各种 cpu 系列的旧标签列表。)[ http://gcc.gnu.org/projects/prefetch.html]
" -fprefetch-loop-arrays 如果目标机器支持,生成指令以预取内存以提高访问大型数组的循环的性能。 此选项可能会生成更好或更差的代码;结果高度依赖于源代码中的循环结构。“(gcc-4.7)[http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html#Optimize-Options]