介绍一下CPU的存储层次
外存、内存、多级高速缓存、寄存器。
如何充分利用CPU缓存机制?
提升代码的时间局部性和空间局部性
GPU架构
大核、小核、全局内存、共享内存、线程、线程块、线程网格
用到了哪些C++11的新特性?
auto、lambda、move、shared_ptr、、、
介绍一下Static修饰符。说一下Static全局变量,局部变量,成员变量的初始化时机。
全局变量、成员变量的初始化是在main函数之前。
局部变量是在第一次执行代码时初始化。
多线程的同步机制有哪些?
互斥锁、信号量、事件、消息、临界区、、、
什么是共享内存?
将一块物理内存同时映射到两个进程的地址空间中。
New出来的变量是不是一定存储在物理内存中?
不是,在堆上申请,有可能是虚拟内存,然后在实际操作的时候,需要把数据调入 物理内存中,这个过程是系统负责的。
VS内存分析工具用过没?
没有
OpenMP的常用命令
#pragma omp parallel
#pragma omp parallel for private(x)
OpenMP和MPI的区别?
OpenMP和MPI是并行编程的两个手段,
对比如下:
OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差;
MPI:进程级;分布式存储;显式(数据分配方式);可扩展性好。
OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。
MPI虽适合于各种机器,但它的编程模型复杂:需要分析及划分应用程序问题,并将问题映射到分布式进程集合;需要解决通信延迟大和负载不平衡两个主要问题;
调试MPI程序麻烦;MPI程序可靠性差,一个进程出问题,整个程序将错误;
作者:李超铮
链接:https://www.zhihu.com/question/20188244/answer/14552204
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
算法题:1-n的数字,每个数字只出现一次,如果有一个数字变为了另一个数字,如何找出这个变化了的数字本来应该是多少。
方法1:快速排序后遍历查找跳变的数字
方法2:开辟一个n大小的新数组B,初始化为全0,遍历原始数组A,将B[A[i]]置为1;最后遍历B数组,若B[k] == 0,则k为所寻。
进阶题:如果数字特别多呢?一个10G的大小的数字文件,如何找出这个跳变的数字?
方法1:先将10G的文件分为100个小文件,先对每个小文件排序,然后归并排序,最后遍历排好序的数组,寻找跳变的值。
方法2:散列分治:
使用A[i]/(n/100)作为散列值,将所有的数字按散列值分到100个不同的小文件中。
然后问题转化位前一个常规的问题。
如果可以直接获得小文件的数字个数,则可以快速定位变化的值应该在哪个小文件中。