打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
地平线2019届技术招聘笔试题
1:在当前深度学习领域应用场景下,请比较ASIC,GPU,FPGA,CPU,DSP的各自优缺点。
ASIC: Application Specific IntegratedCircuit专用集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的专用集成电路。专用型。
GPU: Graphics Processing Unit图形处理单元。GPU是一种专门在个人电脑、工作站、一些移动设备上图像运算工作的微处理器,与CPU类似,只不过GPU是专为执行复杂的数学和几何计算而设计的。并行型。
FPGA: Field Programmable Gate Array现场可编程门阵列。基本原理是在FPGA芯片内集成大量的数字电路基本门电路以及存储器,而用户可以通过烧入FPGA配置文件来来定义这些门电路以及存储器之间的连线。可配置型。
CPU:Central Processing Unit 中央处理器。一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。通用型。
DSP: Digital Signal Processing 数据信号处理器。由大规模或超大规模集成电路心片组成的用来完成某种信号处理任务的处理器。
GPU:通常多核操作,是用来做并行计算的,它的计算能力非常强。CPU:单核或者几个核操作,主要是用来做控制的,是软硬交互的中介,虽然也有很强的计算能力,但是相对于GPU而言还是很弱的。
对于FPGA和ASIC可以理解为乐高积木和完整雕像,前者是可组装的,后者则是完全集成的。前者通过反复的烧写下载文件,它的功能是可以反复修改的,后者一旦流片,是不可修改的。前者通常开发周期短,功耗高,性能差;后者开发周期长,功耗低,性能高。
从可编程性的角度讲,CPU>GPU=FPGA>DSP>ASIC,效率角度则正好相反。
2:请解释以下名词:(1)SOC(2)RSIC (3)CNN (4)DDR
SOC: System on Chip,片上系统
RSIC:ReducedInstruction Set Computer,精简指令集计算机
CNN: Convolutional Neural Network卷积神经网络
DDR: Double Data Rate SDRAM 双倍速率同步动态随机存储器
SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。
3:  请简述系统最高速度计算(最快时钟频率)和流水线设计思想
是时钟上升沿到来到寄存器的输出有效的时间。
Tdelay是组合逻辑的延时。
Tsetup是D触发器的建立时间。
假设数据已被时钟打入D触发器,那么数据到达第一个触发器的Q输出端需要的延时时间是Tco,经过组合逻辑的延时时间为Tdelay,然后到达第二个触发器的D端,要希望时钟能在第二个触发器再次被稳定地打入触发器,则时钟的延迟必须大于Tco+Tdelay+Tsetup,也就是说最小的时钟周期Tmin =Tco+Tdelay+Tsetup,即最快的时钟频率Fmax =1/Tmin。
通常提高系统时钟频率方法是在组合逻辑里面加入触发器,可以避免在两个触发器之间出现过大的延时,消除速度瓶颈,这样可以提高电路的工作频率。这就是所谓"流水线"技术的基本设计思想,即原设计速度受限部分用一个时钟周期实现,采用流水线技术插入触发器后,可用N个时钟周期实现,因此系统的工作速度可以加快,吞吐量加大,但是面积开销变大。
4:请简述SPI,I2C,UART等总线的特点,并对比之前的优劣。
SPI(Serial Peripheral Interface, 串行外设接口)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用在与EEPROM、ADC、显示驱动器之类的慢速外设器件通信。SPI 接口由SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(从使能信号)四种信号构成。
IIC(Inter Integrated Circuit):两根线:一个时钟线SCL和一个数据线SDA。只有一根数据线,所以是半双工通信。
UART:(UniversalAsynchronous Receive Transmitter、通用异步接收发射机),俗称串口。一般是至少三根线:RX、TX和GND。TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式)。
优劣:
UART一帧可以传5/6/7/8位,IIC必须是8位,SPI最多可以发生128位的数据。
SPI和UART都是全双工的,IIC是半双工的。SPI和IIC一个主机可以和多个从机通信,UART只能是一个,SPI是通过片选信号确定从机,IIC是通过地址片选信号的。SPI和IIC是通过时钟通信,UART是通过发和收方固定的波特率通信。
5:请列举至少三个由ImageNet大规模视觉识别挑战赛(ILSVRC)而为人熟知的网络模型及其包括的主要操作(如卷积,RELU,BN等)。
ImageNet
是一个超过15 million的图像数据集,大约有22,000类。
是由李飞飞团队从2007年开始,耗费大量人力,通过各种方式(网络抓取,人工标注,亚马逊众包平台)收集制作而成,它作为论文在CVPR-2009发布。当
(ILSVRC)ImageNet Large Scale Visual Recognition Challenge
经典网络:
LeNet并没有参与ILSVRC比赛,但是它是卷积网络的开上鼻祖
AlexNet2012年ILSVRC的冠军
ZFNet2013年ILSVRC的冠军
GoogLeNet是2014年ILSVRC冠军
ResNet是2015年ILSVRC的冠军。
Trimps-Soushen是2016年ILSVRC的冠军。
SeNet是2017年ILSVRC的冠军
重点介绍:AlexNet,GoogLeNet,ResNet,三个网络。
AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。
Google Net:
深度方面:层数更深,用了22层
宽度方面:采用了Inception结构,这是一种网中网(Network In Network)的结构。
不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合.
整体的网络结构。
ResNet: 34layer
深度残差网络(Deep Residual Network)
为了避免在训练的时候,梯度消失的情况,增加了shortcut connection。
CNN,是卷积操作
RELU, 是激活函数,
BN,是归一化操作。
6:已知计算部件一拍输出8个8-bit的数据,该设计部件总共将输出48*48*8个8-bit数据,现有32-bit位宽,深度1024的SRAM,估算至少需要多少个这样的SRAM才可将计算部件的输出数据全部缓存。
48*48*2=4068;
4068/1024=3.9,4个
7. 如下为音频数据传输标准I2S总线的基本时序图,请根据如下时序图,用SystemVerilog或Verilog写出I2S slave行为级模型和I2S master行为级模型,并且写一个Testbench来验证所实现的行为级模型。要求I2S slave模型1能将I2S master 模型发送来的左右声道的串行数据DATA转变为16bit的并行数据。(15分)
说明:
1)WS为左右声道选择信号,WS高代表左声道,WS低代表右声道;WS为高和为低都持续18个周期,前面16个周期用来传输数据。
2)Bit_clk为时钟信号,用来采集串行数据DATA;DATA为串行数据;
3)对于I2S master而言,信号WS,Bit_clk 和DATA为输出,对于I2S slave 而言,WS,Bit_clk和DATA为输入;
4)I2S master model 用Bit_clk的上升沿送数,I2S slave model用Bit_clk的下降沿采数。
 
  
  
仿真波形:
8. 请画出实现电路图assign out=sel ? A*B :C*D; 并给出资源优化方案。(已知:ABCD均为16bit,sel为1bit) (10分)
答案:
实现电路图:
优化方案:
9. 在FPGA上,一个64选一的MUX,需要消耗多少个6输入LUT?请画出基于LUT的电路结构图。 (10分)
解析:一个6输入的LUT可以形成一个4选一的MUX,如下图所示。其中选择信号为SEL D[1:0],输入数据为DATA D[3:0]。
那么一个SLICE里面有四个LUT,可以组合成一个16选一的MUX,如下图所示,16个输入为DATA D[3:0] DATA C[3:0] DATAB[3:0] DATA A[3:0]。选择信号为SELF7,SELF8,SEL[1:0],共4bit。
故要形成64选一的MUX需要4个SLICE,照如下方式组合。每个SLICE照上面的方式组成16选一的MUX,每个LUT接的4位待选择的数据,共64位数据。每个SLICE的4位选择信号都接一样的。最后再用一个LUT,组成一个4选一的MUX,对前面四个16选一的输出再做选择。故共需要17个LUT。
10.请问C语言中如何避免头文件被重复包含?
问题描述:
显式
隐式
#include "ecourse.h"
#include "ecourse.h"
写了两个重复的头文件。
#include "ecoursea.h"
#include "ecourseb.h"
从头文件名看没有什么问题。如果ecoursea.h和ecourseb.h又同时包含了ecourse.h,那么ecourse.h也同样重复了。
解决方案:
1. 多重包含在绝大多数情况下出现在大型程序中,它往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以使用条件编译。如果所有的头文件都像下面这样编写:
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
...//(头文件内容)
#endif
多重包含的危险就被消除了
当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。
但是,预处理器仍然将整个文件读入,即使这个头文件所有内容将被忽略。由于这种处理将拖慢编译速度,所以如果可能,应该避免出现多重包含。
2. 在windows平台下,可以使用#pragma once
总结:#pragmaonce指定当前文件在构建时只被包含(或打开)一次,这样就可以减少构建的时间,因为加入#pragma once后,编译器在打开或读取第一个#include 模块后,就不会再打开或读取随后出现的同#include 模块。
11.请问malloc/free和new/delete的区别是什么?
a.属性
new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持c。
b.参数
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
c.返回类型
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
e. 分配失败
new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
f.自定义类型
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
g.重载
C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。
h.内存区域
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。
12.给定一个整形变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其他位不变。
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
13.程序找错
void test1()
{
charstring[10];
char*str1 = “0123456789”;
strcpy(string,str1);
}
#include<string.h>
//#include <stdio.h>
void test1()
{
charstring[10];
char*str1 = "0123456789";
strcpy(string,str1);
//printf(string);
}
int main()
{
test1();
return(0);
}
14.下面的代码输出是什么,为什么?
void foo(void)
{
unsignedint a = 6; //0x0006
intb = -20; //0xFFEC  // 65516
(a+b> 6) ? puts(“>6”) : puts(“<6”);
}
>6
补码表示,和unsigned相加,是无符号加法
15. 写出下列代码的输出内容
#include<stdio.h>
void main()
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(“b,c,d:%d, %d, %d”, b, c, d);
return0;
}
b,c,d: 10, 12, 120
++a,先加再赋值;a++,先赋值再加;
16.在对齐为4的情况下
struct BBB
{
longnum;  //4
char*name;  //4
shortint data;  //2
charha; //1
shortba[5]; //2*5
} *p;
p = 0x1000000;
p+0x200=
(ulong)p+0x200 =
(char*)p+0x200 =
解:假设在32bit的CPU上,
sizeof(long)=4bytes
sizeof(char*)=4bytes
sizeof(shortint)=sizeof(short)=2bytes
sizeof(char)=1bytes
由于是4字节对齐,则
sizeof(struct BBB)=sizeof(*p)=4+4+2+1+1(补)+2*5+2(补)=24bytes
p=0x1000000;
1)  p+0x200=0x1000000+0x200*24
指针加法,结果是指针类型字节长度的整数倍。即p偏移sizeof(p)*0x200.
2) (ulong)p+0x200 = 0x1000000+0x200
数值加法,因为经过了ulong操作.
3) (char*)p+0x200=0x1000000+0x200*4
指针加法
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
内存管理 - 动态开辟内存
探究操作系统的内存分配(malloc)对齐策略
【图说新闻】FPGA中六种异步逻辑转化方法
高质量C/C++编程(片段)
C 内存管理详解
malloc函数怎么使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服