Tag: 霓虹灯

ARM霓虹内在函数的深度变换

我试图绕过NEON内在函数,并认为我可以从一个例子开始并提出一些问题。 在这个实验中,我想将32位RGB转换为16位BGR。 将以下代码转换为使用NEON内在函数会有什么好的开始? 我在这里遇到的问题是16bit与我能看到的任何内在都不匹配。 有16×4 16×8等等。但我只是运气不好,围绕着我需要如何解决这个问题。 有小费吗? 这是我试图转换的代码。 typedef struct { uint16_t b:5, g:6, r:5; } _color16; static int depth_transform_32_to_16_c (VisVideo *dest, VisVideo *src) { int x, y; int w; int h; _color16 *dbuf = visual_video_get_pixels (dest); uint8_t *sbuf = visual_video_get_pixels (src); uint16x8 int ddiff; int sdiff; depth_transform_get_smallest (dest, src, &w, &h); ddiff = (dest->pitch […]

Cortex A9 NEON与VFP使用混淆

我正在尝试为Cortex A9 ARM处理器(更具体的OMAP4)构建一个库,我对于哪些\何时在浮点运算和SIMD中使用NEON vs VFP有点困惑。 需要注意的是,我知道2个硬件协处理器单元之间的区别(这也在SO上有所描述),我对它们的正确使用有一些误解。 与此相关我使用以下编译标志: GCC -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp ARMCC –cpu=Cortex-A9 –apcs=/softfp –cpu=Cortex-A9 –fpu=VFPv3 –apcs=/softfp 我已经阅读了ARM文档,很多wiki( 比如这个 ),论坛和博客post,每个人似乎都同意使用NEON比使用VFP或至少混合NEON更好(例如使用instrinsics来实现一些算法在SIMD)和VFP不是一个好主意; 如果这适用于整个应用程序\库的上下文或仅适用于代码中的特定位置(函数),我还不是100%确定。 所以我在我的应用程序中使用neon作为FPU,因为我也想使用内在函数。 结果我遇到了一些麻烦,我对如何在Cortex A9上最好地使用这些function(NEON vs VFP)的困惑只是进一步深化而不是清理。 我有一些代码为我的应用程序进行基准测试,并使用一些自定义的计时器类,其中计算基于双精度浮点。 使用NEON作为FPU会产生完全不合适的结果(尝试打印这些值会导致打印主要是inf和NaN;相同的代码在为x86构建时没有任何障碍)。 所以我改变了我的计算以使用单精度浮点, 据记载,NEON不处理双精度浮点 。 我的基准测试仍然没有给出正确的结果(最糟糕的是现在它在x86上不再起作用了;我认为这是因为精度损失但我不确定)。 所以我几乎完全迷失了:一方面我想使用NEON用于SIMDfunction并使用它,因为FPU没有提供正确的结果,另一方面将它与VFP混合似乎不是一个好主意。 在这方面的任何建议将不胜感激!! 我在上面提到的wiki的文章中找到了在NEON上下文中浮点优化应该做些什么的总结: “ 仅使用单精度浮点 当您发现瓶颈FPfunction时,请使用NEON内在函数/ ASM。 你可以比编译器做得更好。 最小化条件分支 启用RunFast模式 对于softfp: 内联浮点代码(除非它非常大) 通过指针而不是值传递FP参数,并在函数调用之间执行整数工作。 “ 我不能用于浮动ABI,因为我无法链接到我可用的库。 大多数的推荐对我来说都是有意义的(除了“runfast模式”,我不明白应该做什么以及此时我能做得比编译器更好的事实)但是我一直得到不一致的结果和我现在不确定。 任何人都可以了解如何正确使用浮点和NEON用于Cortex A9 […]