历史上的今天
返回首页

历史上的今天

今天是:2025年01月13日(星期一)

正在发生

2020年01月13日 | ARM NEON 编程系列1 - 导论

2020-01-13 来源:eefocus

前言

本系列博文用于介绍ARM CPU下NEON指令优化。


博文github地址:github

相关代码github地址:github

NEON历史

ARM处理器的历史可以阅读文献[2],本文假设读者已有基本的ARM CPU下编程的经验,本文面向需要了解ARM平台下通过NEON进行算法优化的场景。


ARM CPU最开始只有普通的寄存器,可以进行基本数据类型的基本运算。自ARMv5开始引入了VFP(Vector Floating Point)指令,该指令用于向量化加速浮点运算。自ARMv7开始正式引入NEON指令,NEON性能远超VFP,因此VFP指令被废弃。


NEON用途

类似于Intel CPU下的MMX/SSE/AVX/FMA指令,ARM CPU的NEON指令同样是通过向量化计算来进行速度优化,通常应用于图像处理、音视频处理等等需要大量计算的场景。


Hello world

下面给一个最基本的例子来说明NEON的作用:

注意:


代码采用C++11编写,后续博客代码均以C++11编写,不再重述)

此系列博客采用neon2sse.h将NEON指令翻译成SSE指令以使得代码可以在x86/x64 CPU上运行。本文所有代码均在windows vs2013以及android-ndk-r11c下编译测试通过。


完整代码地址:基本NEON优化示例代码

//填充随机数

static void fill_random_value(std::vector& vec_data)

{

    std::uniform_real_distribution distribution(

        std::numeric_limits::min(),

        std::numeric_limits::max());

    std::default_random_engine generator;


    std::generate(vec_data.begin(), vec_data.end(), [&]() { return distribution(generator); });

}

//判断两个vector是否相等

static bool is_equals_vector(const std::vector& vec_a,

  const std::vector& vec_b)

{

    if (vec_a.size() != vec_b.size())

    {

        return false;

    }

    for (size_t i = 0; i < vec_a.size(); i++)

    {

        if (vec_a[i] != vec_b[i])

        {

            return false;

        }

    }

    return true;

}

//正常的vector相乘 (注意:需要关闭编译器的自动向量化优化)

static void normal_vector_mul(const std::vector& vec_a,

  const std::vector& vec_b,

  std::vector& vec_result)

{

    assert(vec_a.size() == vec_b.size());

    assert(vec_a.size() == vec_result.size());

    //compiler may optimized auto tree vectorize (test this diabled -ftree-vectorize)

    for (size_t i = 0; i < vec_result.size();i++)

    {

        vec_result[i] = vec_a[i] * vec_b[i];

    }

}

//NRON优化的vector相乘

static void neon_vector_mul(const std::vector& vec_a,

  const std::vector& vec_b,

  std::vector& vec_result)

{

    assert(vec_a.size() == vec_b.size());

    assert(vec_a.size() == vec_result.size());

    int i = 0;

    //neon process

    for (; i < (int)vec_result.size() - 3 ; i+=4)

    {

        const auto data_a = vld1q_f32(&vec_a[i]);

        const auto data_b = vld1q_f32(&vec_b[i]);

        float* dst_ptr = &vec_result[i];

        const auto data_res = vmulq_f32(data_a, data_b);

        vst1q_f32(dst_ptr, data_res);

    }

    //normal process

    for (; i < (int)vec_result.size(); i++)

    {

        vec_result[i] = vec_a[i] * vec_b[i];

    }

}

//测试函数

//FuncCostTimeHelper是一个计算时间消耗的helper类

static int test_neon()

{

    const int test_round = 1000;

    const int data_len = 10000;

    std::vector vec_a(data_len);

    std::vector vec_b(data_len);

    std::vector vec_result(data_len);

    std::vector vec_result2(data_len);

    //fill random value in vecA & vecB

    fill_random_value(vec_a);

    fill_random_value(vec_b);

    //check the result is same

    {

        normal_vector_mul(vec_a, vec_b, vec_result);

        neon_vector_mul(vec_a, vec_b, vec_result2);

        if (!is_equals_vector(vec_result,vec_result2))

        {

            std::cerr << "result vector is not equals!" << std::endl;

            return -1;

        }

    }

    //test normal_vector_mul

    {

        FuncCostTimeHelper time_helper("normal_vector_mul");

        for (int i = 0; i < test_round;i++)

        {

            normal_vector_mul(vec_a, vec_b, vec_result);

        }

    }

    //test neon_vector_mul

    {

        FuncCostTimeHelper time_helper("neon_vector_mul");

        for (int i = 0; i < test_round; i++)

        {

            neon_vector_mul(vec_a, vec_b, vec_result2);

        }

    }

    return 0;

}


int main(int, char*[])

{

    return test_neon();

}

说明:


这段代码在关闭编译器的自动向量化优化之后,neon_vector_mul大约比normal_vector_mul速度快3倍左右。

这段代码中使用了3条NEON指令:vld1q_f32,vmulq_f32,vst1q_f32。具体指令的作用会在后续博文中说明。

推荐阅读

史海拾趣

Apex Tool Group公司的发展小趣事

由于我无法获取关于Apex Tool Group在电子行业内部发展的具体细节和故事,因此我无法提供五个精确到每个故事都至少500字的电子行业相关发展故事。但我可以根据已知信息,尝试概括Apex Tool Group的发展概况,以及它如何可能涉及电子行业。

Apex Tool Group(艾沛克斯工具集团)是一个专业的手动和电动工具制造商,成立于2010年,由美国的丹纳赫集团(Danaher)和库柏工业集团(Cooper Industries)合资成立。公司总部位于美国马里兰州的Sparks,并在全球拥有20多家工厂,产品覆盖多个国家和地区。

Apex Tool Group的发展之路充满了变革和机遇。它凭借两大集团的技术和资源优势,迅速崛起为行业内的佼佼者。公司不断推出创新产品,满足不同客户的需求,并在市场上获得了良好的口碑。

在电子行业,Apex Tool Group的产品可能也得到了广泛应用。随着电子行业的快速发展,对高精度、高效率的工具需求日益增长。Apex Tool Group凭借其卓越的技术和品质,为电子行业提供了可靠的工具解决方案。无论是在电子产品的制造过程中,还是在电子设备的维修和维护中,Apex Tool Group的工具都发挥着重要作用。

此外,Apex Tool Group还注重与客户的紧密合作。它根据客户的需求提供定制化服务,帮助客户解决实际问题。这种以客户为中心的经营理念,使得Apex Tool Group在电子行业中赢得了广泛的认可和信任。

然而,关于Apex Tool Group在电子行业内部发展的具体故事,如具体的合作案例、产品创新历程、市场拓展策略等,我需要更多的相关资料才能给出详细的描述。如果您对这方面的信息感兴趣,建议查阅Apex Tool Group的官方网站、行业报告或相关新闻报道,以获取更详细的信息。

希望以上内容能够对您有所帮助,如有更多问题,欢迎继续提问。

富信半导体(FOSAN)公司的发展小趣事

台湾第一电阻(Firstohm)公司的发展故事

故事一:创立与早期技术积累

台湾第一电阻电容器股份有限公司(Firstohm)成立于1969年,初期便专注于电阻器的生产制造。在那个电子工业刚刚起步的年代,Firstohm凭借其敏锐的市场洞察力和对技术的不懈追求,逐步在电阻器领域站稳脚跟。1970年,公司开始接受日本东京应濑无线公司的代工订单,外销至日本市场,这一合作为Firstohm打开了国际市场的大门。此后,公司不断引进和吸收先进技术,如1986年从日本横演电子精工取得的精密级金属皮膜电阻技术,为公司的技术积累奠定了坚实基础。

故事二:晶圆电阻的突破

1987年,Firstohm成功研发并量产晶圆电阻(又称MELF电阻),这一成就标志着公司在电阻器制造技术上的重大突破。晶圆电阻以其优异的性能和广泛的应用领域,迅速获得了市场的认可。Firstohm也因此成为全球少数几家具备晶圆电阻生产能力的厂商之一,为公司后续的发展奠定了技术领先地位。

故事三:国际认证与品质提升

进入21世纪,Firstohm更加重视产品品质和国际化发展。2001年,公司获得ISO14001 Green Dove奖项及ISO9001认证,标志着公司在环境管理和质量管理方面达到了国际先进水平。此后,公司不断通过国际认证,如ISO9001:2008、IECQ品质认证等,进一步提升了产品的竞争力和市场信誉。这些认证不仅是对公司产品质量的认可,也为公司拓展国际市场提供了有力支持。

故事四:创新产品的研发

Firstohm始终坚持创新驱动发展战略,不断推出符合市场需求的新产品。例如,2012年,公司间隙式突波吸收器(SGS)获得日本、中国大陆及韩国专利许可;2017年,成功开发AEC-Q200车规级晶圆电阻;2020年,又成功开发出心电导线图(ECG cable)专用电阻器SSWAT系列。这些创新产品的研发和推出,不仅丰富了公司的产品线,也进一步巩固了公司在电阻器领域的市场地位。

故事五:自动化生产与全球化布局

随着电子行业的快速发展和市场竞争的加剧,Firstohm不断加大在自动化生产和全球化布局方面的投入。公司生产线高度自动化,生产效率和产品品质显著提升。同时,Firstohm积极拓展海外市场,与全球多家知名电子企业建立了长期稳定的合作关系。例如,与美国通用、THOMSON、法国雷诺等公司的合作,不仅提升了公司的品牌知名度,也为公司带来了更多的市场机遇和发展空间。

Abilis Systems公司的发展小趣事

Abilis Systems公司是一家专注于数字视频和数字广播领域的半导体公司,以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: Abilis Systems公司成立于2004年,总部位于法国索恩-卢瓦尔省的克勒拉克。公司成立之初,致力于研发数字视频和数字广播领域的创新技术,旨在提供先进的芯片解决方案。

  2. 技术创新和产品推出: 在成立后的几年里,Abilis Systems公司不断进行技术创新,并推出了一系列创新的数字视频和数字广播芯片产品。这些产品包括数字电视接收器和解调器、数字广播接收器等,为客户提供了高性能和高度集成的解决方案。

  3. 市场拓展和国际合作: 随着产品技术的不断成熟和市场需求的增长,Abilis Systems积极拓展国际市场,并与全球各地的客户建立了合作关系。公司的产品被广泛应用于数字电视、数字广播、卫星电视等领域,赢得了客户的信赖和认可。

  4. 并购和战略合作: 为了进一步加强技术实力和扩大市场份额,Abilis Systems公司进行了一系列并购和战略合作。通过收购具有相关技术和市场资源的企业,公司拓展了产品线,并加强了在数字视频和数字广播领域的领先地位。

  5. 未来展望和发展方向: Abilis Systems将继续致力于技术创新和产品升级,加强在数字视频和数字广播领域的研发投入。公司将不断推出符合市场需求的新产品和解决方案,为客户提供更优质的服务和支持。同时,公司还将积极参与行业标准制定和国际合作,推动数字视频和数字广播技术的发展和应用。

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

Alpha & Omega Semiconductor(简称AOS)是一家全球领先的半导体公司,致力于设计、制造和销售高性能、高可靠性的功率半导体产品。以下是Alpha & Omega Semiconductor公司发展的相关故事:

  1. 公司成立和早期发展: Alpha & Omega Semiconductor公司于2000年成立于美国加利福尼亚州的Santa Clara市。公司成立之初,专注于研发和生产功率半导体器件,包括功率MOSFET、IGBT、功率IC和电源管理器件等。通过不断创新和技术突破,公司迅速在市场上建立了良好的声誉,并吸引了投资者的关注。

  2. 技术创新和产品发展: Alpha & Omega Semiconductor公司在功率半导体领域不断进行技术创新和产品研发。他们不断推出新的产品系列,包括低压、中压和高压功率MOSFET、IGBT和功率集成电路等,以满足不同应用领域的需求。公司还专注于提高产品性能、降低功耗,并不断优化产品结构和工艺流程。

  3. 全球化布局和生产基地: 随着业务的不断扩张,Alpha & Omega Semiconductor公司逐步建立了全球化的运营和生产体系。除了总部位于美国的研发中心外,公司还在亚洲地区建立了多个生产基地和销售办事处,包括中国、台湾、韩国和菲律宾等地。这些生产基地不仅提高了产品供应的灵活性和效率,还加强了与当地客户和合作伙伴的合作关系。

  4. 持续投入研发和创新: Alpha & Omega Semiconductor公司持续投入大量资源用于研发和创新,致力于提供行业领先的功率半导体解决方案。公司与全球顶尖的研究机构和合作伙伴合作,共同探索新的材料、工艺和器件结构,以应对不断变化的市场需求和技术挑战。通过持续的技术创新,公司不断拓展产品线,拓展业务领域,并保持了在市场上的竞争优势。

  5. 持续发展和业务拓展: Alpha & Omega Semiconductor公司持续保持业务的稳健增长和发展态势,不断拓展业务范围和市场份额。公司在汽车电子、工业控制、通信设备、消费电子和电源供应等领域取得了广泛的应用,成为了全球领先的功率半导体供应商之一。同时,公司还通过并购和合资等方式,加速业务拓展,拓展了在新兴领域的市场地位。

以上是Alpha & Omega Semiconductor公司发展的相关故事,展示了他们在功率半导体领域的持续创新和不断发展的势头。

Hirosugi-Keiki公司的发展小趣事

对于门控夜明灯电路,网友们可能会有多种问题,以下是一些常见问题及其详细回答:

一、工作原理相关问题

  1. 问:门控夜明灯电路是如何实现自动开关的?
    : 门控夜明灯电路主要通过门控开关、延迟电路、光控电路和电源电路等几部分组成。当门打开时,门控开关触发电路,使电灯点亮。同时,延迟电路控制电灯的点亮时间,一般为几十秒左右。光控电路则确保在光线较暗的环境下(如夜晚)电路才会工作,而在白天则自动封锁电路,避免电灯误亮。

  2. 问:电路中的光控部分是如何工作的?
    : 电路中的光控部分通常由光敏电阻器(如MG45型)和相关的电子元件组成。光敏电阻器的阻值会随着光照强度的变化而变化。在白天,由于光照强度大,光敏电阻器呈现低阻值状态,导致电路中的某个三极管(如VT3)导通,进而封锁整个电路,使电灯不会点亮。而在夜晚,光照强度减弱,光敏电阻器呈现高阻值状态,三极管截止,电路恢复正常工作状态,受门控开关控制。

二、安装调试相关问题

  1. 问:如何安装门控夜明灯电路?
    : 安装门控夜明灯电路时,首先需要将干簧管安装在门框上,将小磁铁安装在门上,并确保两者在门关闭时能够对准并吸合。接着,将电路板固定在合适的位置,并连接好电源线和电灯线。最后,进行电路调试,确保电路能够正常工作。

  2. 问:如何调整电灯的点亮时间?
    : 电灯的点亮时间主要由延迟电路中的电阻和电容决定。要调整点亮时间,可以通过改变电阻(如R2)的阻值或电容(如C1)的容量来实现。一般来说,电阻阻值增大或电容容量增大,都会导致点亮时间延长;反之,则点亮时间缩短。

三、故障排除相关问题

  1. 问:如果电灯不亮,可能是什么原因?
    : 如果电灯不亮,可能是由多种原因造成的。首先,应检查电源是否正常,以及电路中的保险丝是否熔断。其次,检查门控开关是否工作正常,即干簧管和小磁铁是否能够在门打开时正确触发电路。此外,还应检查光控电路是否因光线过强而处于封锁状态。最后,检查电灯本身是否损坏。

  2. 问:电灯在白天也会亮,怎么办?
    : 如果电灯在白天也会亮,可能是光控电路出现了问题。首先,应检查光敏电阻器是否损坏或受到其他光源的干扰。其次,检查与光敏电阻器相关的电子元件(如VT3)是否工作正常。如果问题依然存在,可能需要重新调整光控电路的灵敏度或更换相关元件。

四、其他相关问题

  1. 问:门控夜明灯电路适用于哪些场合?
    : 门控夜明灯电路适用于需要自动照明的各种场合,如家庭玄关、走廊、楼梯间等。它能够在人们进门时自动点亮电灯,为人们提供方便,同时也能够节省能源。

  2. 问:如何选择合适的电灯与电路匹配?
    : 在选择电灯与电路匹配时,首先需要考虑电灯的功率和类型。由于门控夜明灯电路通常设计为低功耗电路,因此建议选择功率较小、发光效率较高的电灯,如LED灯泡。此外,还需要确保电灯的电压和电流与电路的输出相匹配,以避免电路损坏或电灯烧毁。

APM Hexseal公司的发展小趣事

随着公司的发展,APM Hexseal不断拓展其产品线,推出了包括断路器、密封开关、过滤器和密封件等一系列产品。这些产品都经过了严格的测试和认证,以确保其能够满足各种恶劣环境下的使用要求。其中,许多产品都获得了UL认证,进一步证明了其卓越的品质和可靠性。

问答坊 | AI 解惑

新一代视频监控系统应用中存储解决方案

监控技术从上个世纪80年代进入我国以来,随着安防需求的急剧增加一直在飞速发展,从技术层面上来看,已经经历了多个不同的发展阶段。随着计算机技术的发展和网络的普及,目前,视频监控已经发展到了网络多媒体监控系统。       新一 ...…

查看全部问答>

请教usb驱动架构分析!顺便散分...

我的平台:CE5.0 + S3C2442;准备学习USB驱动的开发,但是感觉USB驱动比较复杂,理解比较困难,所以我就偷懒的想请各位有经验的同志能帮忙给分析一下USB驱动的架构,什么HOST(function、clients)、Device(function、clients);OHCI、USBD、HCD等等, ...…

查看全部问答>

如何修改bsp

有没有这方面的书籍,想学bsp的开发,修改。 会克隆别人的bsp,但是要如何修改呢,要如何下手? …

查看全部问答>

vxworks下的u盘问题

我目前在做vxworks下的u盘数据采集,请问:在工程中包含usb组件后,怎样在应用程序中实现对u盘的控制呢?这需不需要涉及到接口芯片的固件编程?…

查看全部问答>

zigbee模块MC13213

ZIGBEEzigbee模块MC13213 38元一个了 超值呀,芯片市场价都要20元了真是亏本卖了http://item.taobao.com/item.htm?id=8233075094…

查看全部问答>

[请教]关于STM32F107的OTG开发

在F107上,个人打算使用OTG下host模式完成U盘的读写操作 目前有几个问题想请教大家: 1. STM32仅仅提供了OTG操作的库函数,关于OTG的上层协议没有任何的涉及对吧?提供的demo还是bin格式的; 2. 如果我打算完成host通信,是否存在两条路: ...…

查看全部问答>

DIY步进电机的初步任务规划

DIY步进电机的初步任务规划  将任务划分为如下部分,每个部分如下:   1.电源部分把我们用的市电~220V变为LM3S811所需要的电压和步进电机所欲要的电压,这个模块要求不高可以一个人完成。  2.按键和显示部分难度也不大,显示可 ...…

查看全部问答>

找工作的迷惑

        大家好,我马上就要开始找工作了,现在有个疑惑想请教大伙,我对单片机和嵌入式很感兴趣,大学里也自学了好多相关的知识,但是现在来招聘的公司似乎和我所学的有点出入,我不是很想放弃学了这么久的单 ...…

查看全部问答>

430的时钟源你弄懂了吗?

学习了很久430单片机,对里面的时钟源还是搞不太清楚,有五个时钟源,又分了好多种时钟信号,谁能清晰的介绍一下吗?感谢…

查看全部问答>