在ARM Cortex-A8处理器中,我了解NEON是什么,它是一个SIMD协处理器.
但VFP(矢量浮点)单元也是一个协处理器,可以作为SIMD处理器使用吗?如果是这样哪个更好用?
我读了几个链接,如 -
但不是很清楚他们的意思.他们说VFP从未打算用于SIMD,但在Wiki上我读了以下内容 - " VFP架构还支持短向量指令的执行,但这些指令依次对每个向量元素进行操作,因此不提供真正的SIMD性能(单指令多数据并行. "
它不是很清楚要相信什么,任何人都可以详细说明这个话题吗?
我正在使用一个名为i.MX515的基于ARM Cortex-A8的处理器.有Linux Ubuntu 9.10发行版.我正在运行一个用C编写的非常大的应用程序,我正在利用gettimeofday();函数来衡量我的应用程序所需的时间.
main()
{
gettimeofday(start);
....
....
....
gettimeofday(end);
}
Run Code Online (Sandbox Code Playgroud)
这个方法足以让我看看我的应用程序块占用了多少时间.但是,现在,我正在尝试使用gettimeofday()计算时间的方法彻底优化我的代码,我看到连续运行之间有很多波动(在我的优化之前和之后运行),所以我不能确定实际执行时间,从而影响我的改进.
谁能告诉我应该怎么做?
如果通过访问循环计数器(在ARM网站上为Cortex-M3建议的想法),任何人都可以向我指出一些代码,它给出了我在Cortex-A8上访问定时器寄存器时必须遵循的步骤吗?
如果这种方法不是很准确,那么请提出一些替代方案.
谢谢
跟进1:在Code Sorcery上编写了以下程序,生成了可执行文件,当我尝试在主板上运行时,我得到了 - 非法指令消息:(
static inline unsigned int get_cyclecount (void)
{
unsigned int value;
// Read CCNT Register
asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
return value;
}
static inline void init_perfcounters (int32_t do_reset, int32_t enable_divider)
{
// in general enable all counters (including cycle counter)
int32_t value = 1;
// …Run Code Online (Sandbox Code Playgroud) 这是一个C++代码:
#define ARR_SIZE_TEST ( 8 * 1024 * 1024 )
void cpp_tst_add( unsigned* x, unsigned* y )
{
for ( register int i = 0; i < ARR_SIZE_TEST; ++i )
{
x[ i ] = x[ i ] + y[ i ];
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个霓虹灯版本:
void neon_assm_tst_add( unsigned* x, unsigned* y )
{
register unsigned i = ARR_SIZE_TEST >> 2;
__asm__ __volatile__
(
".loop1: \n\t"
"vld1.32 {q0}, [%[x]] \n\t"
"vld1.32 {q1}, [%[y]]! \n\t"
"vadd.i32 q0 ,q0, q1 \n\t"
"vst1.32 {q0}, …Run Code Online (Sandbox Code Playgroud) 我正在研究Cortex-A8和Cortex-A9.我知道有些架构没有整数除法,但除了转换为float,divide,转换为整数之外,最好的方法是什么?或者这确实是最好的解决方案?
干杯! =)
可能看起来类似于:ARM和NEON可以并行工作吗?,但不是,我有一些其他问题(可能是我的理解有问题):
在协议栈中,当我们计算校验和时,这是在GPP上完成的,我现在将该任务作为函数的一部分移交给NEON:
这是我作为NEON的一部分编写的校验和函数,发布在Stack Overflow:Intrinsics中的Neon的校验和代码实现
现在,假设从linux调用此函数,
ip_csum(){
…
…
csum = do_csum(); //function call from arm
…
…
}
do_csum(){
…
…
//NEON optimised code
…
…
returns the final checksum to ip_csum/linux/ARM
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下......当NEON进行计算时,ARM会发生什么?ARM闲置吗?还是继续进行其他操作?
你可以看到do_csum被调用,我们正在等待那个结果(或者它看起来像这样)..
注意:
问题:
我正在Android设备上编写针对ARM Cortex-A的代码(使用GNU汇编器和编译器),我正在尝试在Assembly和C之间进行接口.特别是,我有兴趣调用用C语言编写的函数.我尝试了很多东西,包括.extern指令,用asm和__asm__等声明C函数,但是没有一个工作,所以我正在寻找一个这样做的最小例子.对这样的例子的引用同样值得欢迎.
我需要在Beaglebone上运行Linux上的Java应用程序.我知道ARM内核确实支持Jazelle技术在硬件中执行Java字节码.无论如何,我不清楚我需要利用这项技术.我需要以某种方式"激活"Jazelle吗?我需要一个Jazelle知道的Java虚拟机吗?部署和运行利用Jazelle技术的Java软件的流程是什么?使用Jazelle需要许可证吗?
谢谢.
我真的是Cortex A的新入门者,我知道ARM应用了弱有序的内存模型,并且有三种互斥的内存类型:
我粗略地了解了Normal的用途以及强烈有序和设备的含义.然而强烈有序和设备之间的差异让我感到困惑.
根据Cortex-A系列程序员指南,唯一的区别是:
对强排序存储器的写入只有在到达写入访问的外设或存储器组件时才能完成.
允许写入器件存储器在到达写入访问的外设或存储器组件之前完成.
我不太确定这个的真正含义是什么.我猜测,使用强排序或设备键入的内存访问顺序应该与程序员的代码一致(没有无序访问).但是如果输入类型的设备,CPU在访问内存时可能会执行下一条指令,如果键入强排序,它将只是等待访问完成.
如果我错了,请纠正我,请告诉我这样做是什么意思.
提前致谢.
我正在使用Cortex-A8处理器而我不了解如何使用该-mfpu标志.
在Cortex-A8上有vfpv3和霓虹灯协处理器.以前我不知道如何使用霓虹灯,所以我只使用
gcc -marm -mfloat-abi=softfp -mfpu=vfpv3
现在我已经了解了SIMD处理器的运行方式,并且我使用NEON内在函数编写了某些代码.要使用霓虹灯协处理器,我的-mfpu标志必须更改为-mfpu=neon,所以我的编译器命令行看起来像这样
gcc -marm -mfloat-abi=softfp -mfpu=neon
现在,这是否意味着我vfpv3不再使用了?我有很多代码没有使用NEON,这些部分没有使用vfpv3.
如果仍然使用neon和vfpv3,那么我没有问题,但如果只使用其中一个,我怎么能同时使用它们?
我在ARM CortexA8的实际程序中找到了linux以下问题:
´*** glibc detected *** ./PRUssExternal: double free or corruption (top): 0x00024fe8 ***´
Run Code Online (Sandbox Code Playgroud)
我正在网上搜索它,我发现管理这个问题最有用的程序是Valgrind.
然后我尝试在交叉编译中编译到我的系统,在配置中使用以下选项.我正在使用Valgrind 3.8.1
@ -virtual-machine:〜/ valgrind-3.8.1 $ CC = arm-cortexa8-linux-gnueabi-gcc CFLAGS =" - pipe -Os -mtune = cortex-a8 -march = armv7-a -mabi = aapcs-linux -msoft-float -I/opt/OSELAS.Toolchain-2011.11.3/arm-cortexa8-linux-gnueabi/gcc-4.6.2-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitez/sysroot-arm-cortexa8-linux-gnueabi/usr/include"LDFLAGS =" - L/opt/OSELAS.Toolchain-2011.11.3/arm-cortexa8-linux-gnueabi/gcc-4.6.2-glibc-2.14.1 -binutils-2.21.1a-kernel-2.6.39-sanitez/sysroot-arm-cortexa8-linux-gnueabi/usr/lib"./ configure -prefix =/opt/valgrid -host = arm-cortexa8-linux-gnueabi - target = arm-none-linux-gnueabi -build = x86_64-ubuntu-linux
这个配置的输出是:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-cortexa8-linux-gnueabi-strip... arm-cortexa8-linux-gnueabi-strip
checking for a …Run Code Online (Sandbox Code Playgroud)