精华内容
下载资源
问答
  • 嵌入式算法移植优化学习笔记2——SIMD编程(单指令流和多数据流)一级目录二级目录三级目录 参考: 1、...

    一、SIMD概念

    Single Instruction Multiple Data,也就是单指令流和多数据流,对于多数据流进行相同的操作。Single instruction, multiple data (SIMD)是并行计算机的一类(按照Flynn分类法)。它描述了具有多个处理元素(multiple processing elements)的计算机,可以在多个数据点(data points)上同时(simultaneously)完成相同的操作。这种机器利用数据级并行(data level parallelism)(不是并发, concurrency): 在某一时刻,只有一个指令,但有多个同时发生的(simultaneous)计算(computations),也即并行计算。SIMD特别适用于一些常见的任务,例如:调整数字图像的对比度,或者调整数字音频的音量。大部分现代CPU设计都包含了SIMD指令,来提高多媒体使用的性能。不要把SIMD和SIMT搞混了,前者在data level工作,后者要利用线程。一个简单的例子就是向量的加减。

    和MIMD的区别
    SIMD拥有单个全局控制单元,而后者拥有多个控制单元+处理元素。

    二、SIMD的应用

    • 图像处理
    • 音频
    • 科学计算
    • 基于数据的数据并行计算。

    什么情况下适合应用SIMD

    • 规律的数据访问模式:数据在内存中连续存储。
    • 短数据类型
    • 流式数据处理
      ……

    三、使用SIMD的优缺点

    优点

    • 具有更大的并发度。
    • 设计比较简单(应该是与MIMD对比,只需要重复功能单元即可)。
      芯片尺寸更小。

    缺点

    • 程序员开发时必须显式接触硬件。

    四、SIMD并行的问题

    SIMD并行开发,可以把多次相同的算术运算简化为一个SIMD操作;多个取数/存结果的操作,可以变成一个对于更宽的内存的一次操作(前提是内存需要连续)。

    五、SIMD编程的复杂性

    低层编程要求:

    • 数据必须对齐。
    • 数据放在连续区域存储。
    • 控制流问题可能会引入更高的复杂性。

    六、SIMD发展

    所谓的SIMD指令,指的是single instruction multiple data,即单指令多数据运算,其目的就在于帮助CPU实现数据并行,提高运算效率。

    MMX

    MMX是由57条指令组成的SIMD多媒体指令集,MMX将64位寄存当作2个32位或8个8位寄存器来用,只能处理整形计算,这样的64位寄存器有8组,分别命名为MM0~MM7.这些寄存器不是为MMX单独设置的,而是借用的FPU的寄存器,占用浮点寄存器进行运算(64位MMX寄存器实际上就是浮点数寄存器的别名),以至于MMX指令和浮点数操作不能同时工作。为了减少在MMX和浮点数模式切换之间所消耗的时间,程序员们尽可能减少模式切换的次数,也就是说,这两种操作在应用上是互斥的。

    SSE

    SSE全称是Streaming SIMD Extensions,是一种在MMX基础上发展出来的SIMD指令集,其不再占用浮点寄存器,而是使用单独的128位XMM寄存器。在此基础上又发展除了SSE2/SSE3/SSE4指令集。SSE2则进一步支持双精度浮点数,由于寄存器长度没有变长,所以只能支持2个双精度浮点计算或是4个单精度浮点计算,另外,它在这组寄存器上实现了整型计算,从而代替了MMX。SSE3支持一些更加复杂的算术计算。SSE4增加了更多指令,并且在数据搬移上下了一番工夫,支持不对齐的数据搬移,增加了super shuffle引擎等。

    AVX

    在SSE指令集的基础上将128位的XMM寄存器扩展为长度为256位的YMM寄存器,使其支持256位的矢量计算,并且AVX全面兼容SSE/SSE2/SSE3/SSE4,也就是YMM寄存器的低128位就是XMM寄存器。

    3DNow!

    3DNow!是对于Intel MMX寄存器的逻辑拓展,MMX仅提供了并行的整数操作,3DNow!实现了并行浮点操作。3DNow!在现有MMX指令集基础上拓展可以做到混合操作整数代码和浮点代码,同时不需要MMX必须的上下文转换。

    七、相关代码示例

    查看CPU支持的SIMD指令集

    cat /proc/cpuinfo
    

    可以看到编译器支持的SIMD指令集

    flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
    
    

    在这里插入图片描述

    查看GCC处理器支持的SIMD指令集

    gcc -march=native -c -Q --help=target
    

    可以看到支持和不支持的SIMD指令集:

    diyun@diyun-virtual-machine:~/桌面$ gcc -march=native -c -Q --help=target
    The following options are target specific:
      -m128bit-long-double        		[disabled]
      -m32                        		[disabled]
      -m3dnow                     		[disabled]
      -m3dnowa                    		[disabled]
      -m64                        		[enabled]
      -m80387                     		[enabled]
      -m8bit-idiv                 		[disabled]
      -m96bit-long-double         		[enabled]
      -mabi=                      		sysv
      -mabm                       		[enabled]
      -maccumulate-outgoing-args  		[disabled]
      -maddress-mode=             		short
      -madx                       		[enabled]
      -maes                       		[enabled]
      -malign-double              		[disabled]
      -malign-functions=          		0
      -malign-jumps=              		0
      -malign-loops=              		0
      -malign-stringops           		[enabled]
      -mandroid                   		[disabled]
      -march=                     		core-avx2
      -masm=                      		att
      -mavx                       		[enabled]
      -mavx2                      		[enabled]
      -mavx256-split-unaligned-load 	[disabled]
      -mavx256-split-unaligned-store 	[disabled]
      -mbionic                    		[disabled]
      -mbmi                       		[enabled]
      -mbmi2                      		[enabled]
      -mbranch-cost=              		0
      -mcld                       		[disabled]
      -mcmodel=                   		32
      -mcpu=                      		
      -mcrc32                     		[disabled]
      -mcx16                      		[enabled]
      -mdispatch-scheduler        		[disabled]
      -mf16c                      		[enabled]
      -mfancy-math-387            		[enabled]
      -mfentry                    		[enabled]
      -mfma                       		[enabled]
      -mfma4                      		[disabled]
      -mforce-drap                		[disabled]
      -mfp-ret-in-387             		[enabled]
      -mfpmath=                   		387
      -mfsgsbase                  		[enabled]
      -mfunction-return=          		keep
      -mfused-madd                		
      -mfxsr                      		[enabled]
      -mglibc                     		[enabled]
      -mhard-float                		[enabled]
      -mhle                       		[disabled]
      -mieee-fp                   		[enabled]
      -mincoming-stack-boundary=  		0
      -mindirect-branch-register  		[disabled]
      -mindirect-branch=          		keep
      -minline-all-stringops      		[disabled]
      -minline-stringops-dynamically 	[disabled]
      -mintel-syntax              		
      -mlarge-data-threshold=     		0x10000
      -mlong-double-64            		[disabled]
      -mlong-double-80            		[enabled]
      -mlwp                       		[disabled]
      -mlzcnt                     		[enabled]
      -mmmx                       		[disabled]
      -mmovbe                     		[enabled]
      -mms-bitfields              		[disabled]
      -mno-align-stringops        		[disabled]
      -mno-fancy-math-387         		[disabled]
      -mno-push-args              		[disabled]
      -mno-red-zone               		[disabled]
      -mno-sse4                   		[disabled]
      -momit-leaf-frame-pointer   		[disabled]
      -mpc32                      		[disabled]
      -mpc64                      		[disabled]
      -mpc80                      		[disabled]
      -mpclmul                    		[enabled]
      -mpopcnt                    		[enabled]
      -mprefer-avx128             		[disabled]
      -mpreferred-stack-boundary= 		0
      -mprfchw                    		[enabled]
      -mpush-args                 		[enabled]
      -mrdrnd                     		[enabled]
      -mrdseed                    		[enabled]
      -mrecip                     		[disabled]
      -mrecip=                    		
      -mred-zone                  		[enabled]
      -mregparm=                  		0
      -mrtd                       		[disabled]
      -mrtm                       		[disabled]
      -msahf                      		[enabled]
      -msoft-float                		[disabled]
      -msse                       		[enabled]
      -msse2                      		[enabled]
      -msse2avx                   		[disabled]
      -msse3                      		[enabled]
      -msse4                      		[enabled]
      -msse4.1                    		[enabled]
      -msse4.2                    		[enabled]
      -msse4a                     		[disabled]
      -msse5                      		
      -msseregparm                		[disabled]
      -mssse3                     		[enabled]
      -mstack-arg-probe           		[disabled]
      -mstackrealign              		[enabled]
      -mstringop-strategy=        		[default]
      -mtbm                       		[disabled]
      -mtls-dialect=              		gnu
      -mtls-direct-seg-refs       		[enabled]
      -mtune=                     		generic
      -muclibc                    		[disabled]
      -mveclibabi=                		[default]
      -mvect8-ret-in-mem          		[disabled]
      -mvzeroupper                		[disabled]
      -mx32                       		[disabled]
      -mxop                       		[disabled]
      -mxsave                     		[enabled]
      -mxsaveopt                  		[enabled]
    
      Known assembler dialects (for use with the -masm-dialect= option):
        att intel
    
      Known ABIs (for use with the -mabi= option):
        ms sysv
    
      Known code models (for use with the -mcmodel= option):
        32 kernel large medium small
    
      Valid arguments to -mfpmath=:
        387 387+sse 387,sse both sse sse+387 sse,387
    
      Known indirect branch choices (for use with the -mindirect-branch=/-mfunction-return= options):
        keep thunk thunk-extern thunk-inline
    
      Known vectorization library ABIs (for use with the -mveclibabi= option):
        acml svml
    
      Known address mode (for use with the -maddress-mode= option):
        long short
    
      Valid arguments to -mstringop-strategy=:
        byte_loop libcall loop rep_4byte rep_8byte rep_byte unrolled_loop
    
      Known TLS dialects (for use with the -mtls-dialect= option):
        gnu gnu2
    

    在这里插入图片描述

    SIMD指令使用举例

    简单浮点数矩阵乘法(编译器优化)
    float_matrix_mutiply.c:

    #include <stdio.h>
    #include <stdio.h>
    void printf_matrix(int x,int y,double a[x][y])
    {
            for(int i=0;i<x;i++){
                    for(int j=0;j<y;j++){
                            printf("%lf ",a[i][j]);
                    }
                    printf("\n");
            }
    }
    
    int main()
    {
            int M=2,N=3,P=4;
            double matrix1[M][N];
            double matrix2[N][P];
    
            FILE *fp1,*fp2;
            fp1 = fopen("./matrix1","r");
            fp2 = fopen("./matrix2","r");
    
            int i = 0;
            while(!feof(fp1)){
                    fscanf(fp1,"%lf %lf %lf",&matrix1[i][0],&matrix1[i][1],&matrix1[i][2]);
                    i++;
            }
            printf("The first matrix is:\n");
            printf_matrix(M,N,matrix1);
    
            int j = 0;
            while(!feof(fp2)){
                    fscanf(fp2,"%lf %lf %lf %lf",&matrix2[j][0],&matrix2[j][1],&matrix2[j][2],&matrix2[j][3]);
                    j++;
            }
            printf("The second matrix is:\n");
            printf_matrix(N,P,matrix2);
    
            double result[M][P];
            for(int i=0;i<M;i++){
                    for(int k=0;k<P;k++){
                            for(int j=0;j<N;j++){
                                    result[i][k] += matrix1[i][j]*matrix2[j][k];
                            }
                    }
            }
            printf("The matrix mutilpy result is:\n");
            printf_matrix(M,P,result);
    }
    

    编译:

    gcc float_matrix_mutiply.c -o float_matrix_mutiply -msse -mfpmath=sse -march=native
    

    反编译可以看到使用了xmm寄存器以及movsd这样的SIMD指令:​

    diyun@diyun-virtual-machine:~/桌面/0205_test$ objdump -d float_matrix_mutiply  |grep xmm
      400725:	c5 fb 10 45 c8       	vmovsd -0x38(%rbp),%xmm0
      400d9a:	c5 fb 10 0c d0       	vmovsd (%rax,%rdx,8),%xmm1
      400dc3:	c5 fb 10 14 d0       	vmovsd (%rax,%rdx,8),%xmm2
      400dec:	c5 fb 10 04 d0       	vmovsd (%rax,%rdx,8),%xmm0
      400df1:	c5 eb 59 c0          	vmulsd %xmm0,%xmm2,%xmm0
      400df5:	c5 f3 58 c0          	vaddsd %xmm0,%xmm1,%xmm0
      400e16:	c5 fb 11 04 d0       	vmovsd %xmm0,(%rax,%rdx,8)
    
    

    在这里插入图片描述

    参考:
    1、https://blog.csdn.net/sinat_26210035/article/details/88773961?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

    2、https://blog.csdn.net/Rosalind_Xu/article/details/89576595?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

    3、https://zhuanlan.zhihu.com/p/71266408
    4、https://www.cnblogs.com/xidian-wws/p/11023762.html
    5、https://blog.csdn.net/weixin_42826139/article/details/86313717

    展开全文
  • 嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么一、什么是CPU?二、什么是GPU?三、什么是TPU?四、什么是NPU?附: 一、什么是CPU? 中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其...

    嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么


    随着AI的广泛应用,深度学习已成为当前AI研究和运用的主流方式。面对海量数据的并行运算,AI对于算力的要求不断提升,对硬件的运算速度及功耗提出了更高的要求。

    目前,除通用CPU外,作为硬件加速的GPU、NPU、FPGA等一些芯片处理器在深度学习的不同应用中发挥着各自的优势,但孰优孰劣?

    以人脸识别为例,其处理基本流程及对应功能模块所需的算力分布如下:
    在这里插入图片描述
    为什么会有这样的应用区分?

    意义在哪里?

    想要知道其中的答案,需要我们先从CPU、GPU、NPU、FPGA它们各自的原理、架构及性能特点来了解。

    首先,我们先来了解一下通用CPU的架构

    一、什么是CPU?

    中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速及实现它们缓冲处理器之间联系的数据、控制的总线。电子计算机三大核心部件就是CPU、内部存储器、输入/输出设备。中央处理器的功效主要为处理指令、执行操作、控制时间、处理数据。在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。
    主要逻辑架构包括控制单元Control,运算单元ALU和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。简单说,就是计算单元、控制单元和存储单元
    架构图如下所示:
    在这里插入图片描述
    CPU遵循的是冯诺依曼架构,其核心是存储程序、顺序执行。CPU的架构中需要大量的空间去放置存储单元(Cache)和控制单元(Control),相比之下计算单元(ALU)只占据了很小的一部分,所以它在大规模并行计算能力上极受限制,而更擅长于逻辑控制。

    CPU无法做到大量矩阵数据并行计算的能力,但GPU可以。

    二、什么是GPU?

    图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。

    GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时GPU所采用的核心技术有硬件T&L(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件T&L技术可以说是GPU的标志。GPU的生产商主要有NVIDIA和ATI。

    GPU的构成相对简单,有数量众多的计算单元和超长的流水线,特别适合处理大量的类型统一的数据。但GPU无法单独工作,必须由CPU进行控制调用才能工作。CPU可单独作用,处理复杂的逻辑运算和不同的数据类型,但当需要大量的处理类型统一的数据时,则可调用GPU进行并行计算。

    在这里插入图片描述

    与CPU相比,CPU芯片空间的不到20%是ALU,而GPU芯片空间的80%以上是ALU。即GPU拥有更多的ALU用于数据并行处理

    以Darknet构建的神经网络模型AlexNet、VGG-16及Restnet152在GPU Titan X, CPU Intel i7-4790K (4 GHz) 进行ImageNet分类任务预测的结果:
    在这里插入图片描述

    备注:以上数据源自https://pjreddie.com/darknet/imagenet/#reference

    由此可见,GPU处理神经网络数据远远高效于CPU。

    总结GPU具有如下特点:

    • 1 、多线程,提供了多核并行计算的基础结构,且核心数非常多,可以支撑大量数据的并行计算。

    • 2、拥有更高的访存速度。

    • 3、更高的浮点运算能力。

    因此,GPU比CPU更适合深度学习中的大量训练数据、大量矩阵、卷积运算。

    GPU虽然在并行计算能力上尽显优势,但并不能单独工作,需要CPU的协同处理,对于神经网络模型的构建和数据流的传递还是在CPU上进行。同时存在功耗高,体积大的问题。

    性能越高的GPU体积越大,功耗越高,价格也昂贵,对于一些小型设备、移动设备来说将无法使用

    因此,一种体积小、功耗低、计算性能高、计算效率高的专用芯片NPU诞生了。

    三、什么是NPU?

    嵌入式神经网络处理器(NPU)采用“数据驱动并行计算”的架构,特别擅长处理视频、图像类的海量多媒体数据。
    NPU处理器专门为物联网人工智能而设计,用于加速神经网络的运算,解决传统芯片在神经网络运算时效率低下的问题。在GX8010中,CPU和MCU各有一个NPU,MCU中的NPU相对较小,习惯上称为SNPU。

    NPU处理器包括了乘加、激活函数、二维数据运算、解压缩等模块。

    • 乘加模块用于计算矩阵乘加、卷积、点乘等功能,NPU内部有64个MAC,SNPU有32个。

    • 激活函数模块采用最高12阶参数拟合的方式实现神经网络中的激活函数,NPU内部有6个MAC,SNPU有3个。

    • 二维数据运算模块用于实现对一个平面的运算,如降采样、平面数据拷贝等,NPU内部有1个MAC,SNPU有1个。

    • 解压缩模块用于对权重数据的解压。为了解决物联网设备中内存带宽小的特点,在NPU编译器中会对神经网络中的权重进行压缩,在几乎不影响精度的情况下,可以实现6-10倍的压缩效果。

    NPU工作原理是在电路层模拟人类神经元和突触,并且用深度学习指令集直接处理大规模的神经元和突触,一条指令完成一组神经元的处理。相比于CPU和GPU,NPU通过突触权重实现存储和计算一体化,从而提高运行效率。
    在这里插入图片描述
    NPU是模仿生物神经网络而构建的,CPU、GPU处理器需要用数千条指令完成的神经元处理,NPU只要一条或几条就能完成,因此在深度学习的处理效率方面优势明显。

    实验结果显示,同等功耗下NPU 的性能是 GPU 的 118 倍

    与GPU一样,NPU同样需要CPU的协同处理才能完成特定的任务。下面,我们可以看一下GPU和NPU是如何与CPU协同工作的。

    GPU的加速

    GPU当前只是单纯的并行矩阵的乘法和加法运算,对于神经网络模型的构建和数据流的传递还是在CPU上进行
    在这里插入图片描述

    CPU加载权重数据,按照代码构建神经网络模型,将每层的矩阵运算通过CUDA或OpenCL等类库接口传送到GPU上实现并行计算,输出结果;CPU接着调度下层神经元组矩阵数据计算,直至神经网络输出层计算完成,得到最终结果。

    四、什么是TPU?

    TPU(Tensor Processing Unit)即张量处理单元,是一款为机器学习而定制的芯片,经过了专门深度机器学习方面的训练,它有更高效能(每瓦计算能力)。

    因为它能加速其第二代人工智能系统TensorFlow的运行,而且效率也大大超过GPU――Google的深层神经网络就是由TensorFlow引擎驱动的。TPU是专为机器学习量身定做的,执行每个操作所需的晶体管数量更少,自然效率更高。

    TPU与同期的CPU和GPU相比,可以提供15-30倍的性能提升,以及30-80倍的效率(性能/瓦特)提升。

    TPU每瓦能为机器学习提供比所有商用GPU和FPGA更高的量级指令,这基本相当于7年后的科技水平。TPU是为机器学习应用特别开发,以使芯片在计算精度降低的情况下更耐用,这意味每一个操作只需要更少的晶体管,用更多精密且大功率的机器学习模型,并快速应用这些模型,因此用户便能得到更正确的结果。

    附:

    CPU/GPU/NPU/FPGA各自的特点
    在这里插入图片描述

    • APU – Accelerated Processing Unit, 加速处理器,AMD公司推出加速图像处理芯片产品。

    • BPU – Brain Processing Unit, 地平线公司主导的嵌入式处理器架构。

    • CPU – Central Processing Unit 中央处理器, 目前PC core的主流产品。

    • DPU – Deep learning Processing Unit, 深度学习处理器,最早由国内深鉴科技提出;另说有Dataflow Processing Unit 数据流处理器, Wave Computing 公司提出的AI架构;Data storage Processing Unit,深圳大普微的智能固态硬盘处理器。

    • FPU – Floating Processing Unit 浮点计算单元,通用处理器中的浮点运算模块。

    GPU – Graphics Processing Unit, 图形处理器,采用多线程SIMD架构,为图形处理而生。

    • HPU – Holographics Processing Unit 全息图像处理器, 微软出品的全息计算芯片与设备。

    • IPU – Intelligence Processing Unit, Deep Mind投资的Graphcore公司出品的AI处理器产品。

    • MPU/MCU – Microprocessor/Micro controller Unit, 微处理器/微控制器,一般用于低计算应用的RISC计算机体系架构产品,如ARM-M系列处理器。

    • NPU – Neural Network Processing Unit,神经网络处理器,是基于神经网络算法与加速的新型处理器总称,如中科院计算所/寒武纪公司出品的diannao系列。

    • RPU – Radio Processing Unit, 无线电处理器, Imagination Technologies 公司推出的集合集Wifi/蓝牙/FM/处理器为单片的处理器。

    • TPU – Tensor Processing Unit 张量处理器, Google 公司推出的加速人工智能算法的专用处理器。目前一代TPU面向Inference,二代面向训练。

    • VPU – Vector Processing Unit 矢量处理器,Intel收购的Movidius公司推出的图像处理与人工智能的专用芯片的加速计算核心。

    • WPU – Wearable Processing Unit, 可穿戴处理器,Ineda Systems公司推出的可穿戴片上系统产品,包含GPU/MIPS CPU等IP。

    • XPU – 百度与Xilinx公司在2017年Hotchips大会上发布的FPGA智能云加速,含256核。

    • ZPU – Zylin Processing Unit, 由挪威Zylin 公司推出的一款32位开源处理器。

    展开全文
  • 1、https://blog.csdn.net/networkhunter/article/details/100218945
    展开全文
  • cudaMemcpy(void *dst, void *src, size_t nbytes,enum cudaMemcpyKind direction)
  • 模型较大对于嵌入式设备来说是一个很大的负担; 2.运行时占用内存:在推理期间,CNN的中间激活值/响应存储空间甚至需要比存储模型参数的大,即使batchsize是1.这对于高性能的GPU来说不是问题,但对于低计算能力的...

    模型部署的三大挑战

    1.模型大小:CNN优异的性能表现来源于上百万可训练的参数。那些参数和网络结构信息需要被存储到硬盘,然后在推理期间加载到内存中。模型较大对于嵌入式设备来说是一个很大的负担;
    2.运行时占用内存:在推理期间,CNN的中间激活值/响应存储空间甚至需要比存储模型参数的大,即使batchsize是1.这对于高性能的GPU来说不是问题,但对于低计算能力的许多应用来说这是不可承担的;
    3.计算量:在高分辨率图片上卷积操作可能会计算密集,一个大的CNN在嵌入式设备上可能要花费几分钟来处理一张单个图片,这使得在真实应用中采用很不现实

    参考:
    1、https://www.cnblogs.com/chumingqian/articles/11505153.html
    2、https://blog.csdn.net/qq_38109843/article/details/107234801
    3、https://blog.csdn.net/moxibingdao/article/details/106666957
    4、网课:https://edu.csdn.net/learn/29887
    5、浅析张量分解(Tensor Decomposition)
    6、network sliming:加快模型速度同时不损失精度

    展开全文
  • #pragma omp parallel num_threads(3)
  • 今天大嘴主要介绍一下这些年来本人在做图像算法嵌入式移植时常采用的优化方法,由于篇幅和时间有限,这里主要列出一个大框,具体的如果大家有兴趣可以慢慢与大嘴交流。 一. 前序 1. 图像算法嵌入式移植时...
  • 本文涉及的内容可能是大家在移植算法的时候会出现的错误,不涉及特定公司的内容,希望老板不要介意。如今临时遇到了这些问题。解决的方法也许不是最好的。能给他人起到一点作用就算不错。 移植内容 1 windows上面...
  • 在OpenCV中,新技术的支持和一些现有算法的优化都是体现在最新的版本中(目的是为了让用户用新版本),旧版本通常只修正bug。 一、移植的先前准备如下: 1.centos-7虚拟机 2.安装cmake3和make工具 二、移植的过程...
  • 大嘴的平凡之路:我选择做了一名“嵌入式算法工程师” (#####特别说明:请扫描文后的二维码加入大嘴的知识星球) 请允许我用很不漂亮又普通的大白话自述: 1)我的技术经历: 05年本科(电子信息)毕业,08年硕士...
  • 嵌入式移植

    2018-10-17 11:35:39
    深度学习嵌入式移植: 1、移植原因:算法必须在优化后的硬件上运行,因为学习成千上万的数据可能需要长达几周的时间。移动端其实不需要做tranning,只需要进行propagating,所以问题集中在移动端能不能存放并运行...
  • 算法优化工程师

    2021-08-10 16:51:00
    嵌入式算法移植优化-CUDA编程 嵌入式算法移植优化-CPU,GPU,TPU,NPU都是什么 嵌入式算法移植优化-模型压缩与剪枝 嵌入式算法移植优化-pthread 嵌入式算法移植优化-SIMD编程(单指令流和多数据流) 嵌入式算法...
  • 1、将要用到的opencv 相关的库打包,利用你要移植的平台第三方编译器进行交叉编译,因为如果你利用其它编译器即使编译通过了,在另外的工程调用时也会提示错误,一般会报错误:undefined reference to"xxx"错误,...
  • 今天大嘴主要介绍一下这些年来本人在做图像算法嵌入式移植时常采用的优化方法,由于篇幅和时间有限,这里主要列出一个大框,具体的如果大家有兴趣可以慢慢与大嘴交流。 一. 前序 1. 图像算法嵌入式移植时...
  • 声明:本文参考网友zjb_integrated的文章《TI Davinci DM6446开发攻略——开发环境搭建...由于DM6441和DM6446两款芯片大同小异,在进行嵌入式Linux系统移植时可相互参考。 TI DAVINCI DM6441的开发环境搭建不
  • linux2.6.29.4移植中,需要对NAND分区部分代码进行修改。友善的源码中,对于这个分区的代码是在 arch/arm/plat-s3c24xx/common-frendly-arm.c中,一般的源码不是在这个位置,这点要注意。 一般的源码是在arch/arm/...
  • 嵌入式Linux系统原有调度算法基础上,采用移植LSF算法的方式来提高其系统的调度性能,并且给出了相关其他调度算法移植嵌入式Linux系统的具体步骤,为算法的移植提供了模板。通过实验发现,移植后的系统可调度性...
  • Android is a Dalvik Virtual Machine based software platform that runs on a Linux based kernel. Therefore, to port an Android platform, one needs to port the underlying Linux OS and then the Android p
  • CNN量化-嵌入式移植

    2020-06-12 14:34:32
    必备) https://github.com/Tencent/ncnn/wiki/FAQ-ncnn-produce-wrong-result caffeModels--models-caffes-大全 https://www.cnblogs.com/leoking01/p/7123154.html FPGA移植CNN算法 CNN算法FPGA移植 ...
  • C语言写的sift算法,亲测,可用,可以移植到linux,嵌入式
  • 编辑推荐:本文来自于csdn,主要介绍了MATLAB与SIMULINK仿真嵌入式C算法的概述与方法。概述为在嵌入式开发中碰到的算法验证问题,借助matlab平台可以更方便的调试。如控制算法,可以先验证算法编写的正确性,防止盲目...
  • 多种嵌入式文件系统移植集合

    万次阅读 2013-06-01 21:23:34
    1. 嵌入式存储系统 1.1. 计算机组成原理 从冯.诺依曼的存储程序工作原理及计算机的组成来说,计算机由运算器、控制器、存储器和输入/输出设备五大部件组成。其中运算器和控制器统称为中央处理器(CPU),而存储系统...
  • 随着二十一世纪的到来,电子产品已经成为人们生活和学习中不可缺少的必备品。...目前主打的算法移植类芯片也分很多种,例如保护嵌入式端程序的加密芯片例如LKT4101。还有保护PC端程序的加密狗芯片等等。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,163
精华内容 7,665
关键字:

嵌入式算法移植