高性能计算工程师面试经验

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:C/C++面试整理
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

目录

高性能计算工程师

面试问题

1.自我介绍

2.CUDA GPU 加速瓶颈

3.模板计算的优化方法,如何找到瓶颈

4.RDMA 在 A 项目中加速多少?

5.编译过程

6.如何高效利用 L1 缓存

程序题


高性能计算工程师


岗位要求:

    计算机、电子、通信专业,硕士及以上学历。
    精通C++语言,具有3年及以上的linux环境下C/C++多线程和多进程开发经验, 熟练掌握Linux环境下C++网络编程技术。 具有linux环境下丰富的代码调试经验。
    熟练掌握计算机系统相关原理和结构,了解常见处理器(X86、ARM等)、缓存、传输总线、存储介质的基础知识。
    具有OpenMP、MPI、RDMA等高性能计算相关技术的开发经验,通过对Linux内核的优化,开发出基于CPU的高性能、低延迟抖动系统。
    具有多年的cuda并行计算开发经验优先。
    具有优秀的团队沟通和协作能力、责任心强,善于学习,有较强的自我驱动,具有独立分析并解决问题的能力。

面试问题


1.自我介绍


介绍项目和技术栈

2.CUDA GPU 加速瓶颈


分单设备和多设备的加速情况
单设备:
1.流
2.共享内存(优化 bank)
3.寄存器
4.循环展开
5.访问主存(硬件决定,128bit 或者 64bit)
6.block大小的设置(由 SM 的条件决定)
7.

多设备:
1.进程间通信方法
2.双缓冲技术(类似于流)
3.RDMA 技术
4.

3.模板计算的优化方法,如何找到瓶颈


1.双缓冲
2.主从传输方法
3.循环展开、宏定义(涉及到从核的指令缓存,不能过度展开循环)
4.修改为传输方式为跨步传输,可以减少指令?
5.检查算法减少,无效的计算
6.进程的计算任务划分,尽量减少进程间通信量
7.主核也参与部分计算
8.

子问题 神威 cpu 的特点:

    主从核访存延迟

    算力大小

4.RDMA 在 A 项目中加速多少?


设备不支持RDMA

5.编译过程

    预处理
    宏定义展开、头文件展开、条件编译、删除注释
    编译
    检查语法(词法分析、语法分析、语义分析),生成汇编语言
    汇编
    将汇编语言生成二进制文件
    链接
    链接程序所需要的库,生成可执行文件

GCC拆分编译过程后:
预处理:gcc -E hello.c -o hello.i
编 译:gcc -S hello.i -o hello.s
汇 编:gcc -c hello.s -o hello.o
链 接:gcc hello.o -o hello

子问题:extern 一个其他文件 static 的变量或者函数,在编译过程中会发生什么?
extern 修饰全局变量,所有全局变量、函数默认带有 extern 修饰符。
static 修饰局部变量,不可被其他文件引用。函数内,变量的生命周期。
链接时候报错:无法解析的外部符号。

6.如何高效利用 L1 缓存


因为很少在做CPU多线程,就没答上。但回头想想,提高命中率、SIMD、编译器优化、代码重排确实是应该答出来的。

    局部性原理:根据局部性原理,程序执行时的访存模式通常是以块为单位进行的。因此,可以通过将数据存储在连续的内存块中,以及将访问同一个内存块的代码放在一起执行,从而提高数据在L1缓存中的命中率。

    数据结构:在设计数据结构时,要注意结构体成员的排列顺序,以便利用好L1缓存。可以将结构体的成员按照类型、大小、使用频率等因素进行排列,从而最大化利用L1缓存。

    编译器优化:编译器可以通过指令调度、循环展开、内联函数等方式优化代码,减少对内存的访问,提高L1缓存的利用率。例如,可以将循环展开成一系列单独的指令,以减少对数组元素的访问次数。

    SIMD指令:L1缓存可以利用SIMD指令进行向量化操作,加快数据处理速度。SIMD指令可以同时对多个数据进行操作,从而提高指令级并行度,减少访问内存的次数,提高L1缓存的命中率。

    代码重排:在程序中,可以通过代码重排来提高L1缓存的利用率。例如,可以将代码中访问同一个内存块的语句放在一起执行,减少L1缓存的替换和预取,从而提高缓存的命中率。

程序题


1.给出最大线程总数,使用多线程加速归并排序
写出来思路没问题,需要利用线程池,但未实现。面试后实际跑起来发现是负优化,开了多线程但是CPU利用率提不上去,未解决该问题。

#include <iostream>
#include <thread>
using namespace std;class Sorter
{
public:Sorter();Sorter(int t_cnt);~Sorter();static int mergesort(int* array, int left, int right);static int sort(int* array, int left, int mid, int right);static int mergesort_multithread(int* array, int left, int right, int thread_cnt);private:int thread_cnt;
};Sorter::Sorter(){thread_cnt = 16;
}Sorter::Sorter(int t_cnt){thread_cnt = t_cnt;
}Sorter::~Sorter(){}int Sorter::mergesort(int* array, int left, int right){if (left >= right - 1){return 0;}int mid = (left + right) / 2;mergesort(array, left, mid);mergesort(array, mid, right);sort(array, left, mid, right);return 0;
}int Sorter::sort(int* array, int left, int mid, int right){int length = right - left;int merge_size = sizeof(int) * length;int* temp = (int*)_malloca(merge_size);// int* temp = new int[length];int i = left, j = mid, k = 0;while (i < mid && j < right) {if (array[i] < array[j]){temp[k++] = array[i++];}else{temp[k++] = array[j++];}}while (i<mid){temp[k++] = array[i++];}while (j<right){temp[k++] = array[j++];}memcpy(&array[left], temp, merge_size);// delete temp;return 0;
}int Sorter::mergesort_multithread(int* array, int left, int right,int thread_cnt){if (left >= right - 1) {return 0;}int mid = (left + right) / 2;if (thread_cnt > 1){thread_cnt = thread_cnt / 2;thread t1(mergesort_multithread, array, left, mid, thread_cnt);thread t2(mergesort_multithread, array, mid, right,thread_cnt);t1.join();t2.join();sort(array, left, mid, right);}else{mergesort(array, left, mid);mergesort(array, mid, right);sort(array, left, mid, right);}return 0;
}void init_array(int* array, int length, int l = 0, int r = 1 << 10){srand(time(0));  //设置时间种子for (int i = 0; i < length; i++) {int temp = rand() % (r - l + 1) + l;array[i] = temp;//生成区间r~l的随机数 }
}int evaluate_merge_sort(int length){int* array = new int[length];Sorter a;clock_t begin, end, sum=0;init_array(array, length);a.mergesort(array, 0, length);for (int t = 0; t < 10; t++){init_array(array, length);begin = clock();a.mergesort(array, 0, length);end = clock();sum += end - begin;}cout << "mergesort:" << double(sum) / CLOCKS_PER_SEC * 1000 << " ms" << endl;return 0;
}int evaluate_merge_sort_multithread(int length){int* array = new int[length];Sorter a;clock_t begin, end, sum=0;init_array(array, length);a.mergesort_multithread(array, 0, length, 8);/*for (int i = 0; i < length; i++){cout << array[i] << " ";}*/for (int t = 0; t < 10; t++){init_array(array, length);begin = clock();a.mergesort_multithread(array, 0, length, 16);end = clock();sum += end - begin;}cout << "mergesort_multithread:" << double(sum) / CLOCKS_PER_SEC * 1000 << " ms" << endl;return 0;
}int main(){int length = 1 << 20;evaluate_merge_sort(length);evaluate_merge_sort_multithread(length);return 0;// std::cout << "Hello World!\n";
}

🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!欢迎关注、关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】面试手撕深拷贝

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深拷贝的作用深浅拷贝的区别浅拷贝深拷贝 深拷贝实现方式JSON.parse(JSON.stringi…

微信小程序云开发教程——墨刀原型工具入门(素材面板)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

在云端构建和部署工作负载的最佳方式是怎样的?

如果要问当今企业希望从云计算中获得什么&#xff0c;那么 “低延迟” 以及 “更接近客户” 可能会是很多企业的首要目标。低延迟可以带来诸多好处&#xff0c;如提升用户满意度、增加竞争优势、降低运营成本等&#xff1b;更接近客户则有助于降低网络拥塞、减少数据丢失、符合…

Java设计模式:外观模式

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

ArcGIS学习(十四)OD分析

ArcGIS学习(十四)OD分析 1.上海市KFC与麦当劳的空间聚集度分析 本任务给大家带来的内容是网络节点关系分析。网络节点关系分析一般也叫OD分析。“O”指的是起点(ORIGIN),"D”指的是终点(DESTINATION),0D分析即为基于起点到终点的分析。 网络节点关系分析我们经常…

LeetCode每日一题 搜索插入位置(二分查找)

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 示例 1&#xff1a; 输入: nums [1,3,5,6], target 5 输…

基于springboot的厨艺交流平台

采用技术 基于springboot的厨艺交流平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示 食材分类管理 用户信息管理 菜谱分类管理 菜谱信息管理 食材信息…

Swarm集群负载均衡的实现方式

目录 1. 背景2. 参考3. 环境4. 概念5. Swarm 网络5.1 Swarm 网络连接情况5.2 外部访问数据包转发流程 6 Swarm集群服务信息7 Swarm集群数据包转发流程7.1 Client发送请求至集群节点9090端口7.1.1 集群节点宿主机Netfilter规则7.1.2 Tcpdump抓包验证结果 7.2 Ingress_sbox下IPVS…

后缀表达式的计算

用栈实现&#xff1a; 1、初始化一个栈&#xff0c;用于保存操作数 2、从左往右扫描下一个元素&#xff0c;直到处理完所有元素。 若扫描到操作数。压入栈。若扫描到运算符。弹出两个栈顶元素&#xff0c;执行相应运算&#xff0c;运算结果压回栈顶。

【Golang星辰图】Go语言云计算SDK全攻略:深入Go云存储SDK实践

Go语言云计算和存储SDK全面指南 前言 在当今数字化时代&#xff0c;云计算和存储服务扮演着至关重要的角色&#xff0c;为应用程序提供高效、可靠的基础设施支持。本文将介绍几种流行的Go语言SDK&#xff0c;帮助开发者与AWS、Google Cloud、Azure、MinIO、 阿里云和腾讯云等…

tomcat的安全配置:

tomcat的安全配置&#xff1a; 1、当Tomcat完成安装后你首先要做的事情如下&#xff1a; 复制 首次安装完成后立即删除webapps下面的所有代码 rm -rf /srv/apache-tomcat/webapps/* 注释或删除 tomcat-users.xml 所有用户权限&#xff0c;看上去如下&#xff1a; cat conf/…

【漏洞复现】网康NS-ASG应用安全网关 index.php SQL注入漏洞(CVE-2024-2330)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品&#xff0c;集成了SSL和 IPSecQ&#xff0c;旨在保障业务访问的安全性&#xff0c;适配所有移动终端&#xff0c;提供多种链路均衡和选择技术&#xff0c;支持多种认证方式灵活组合&#xff0c;以及内置短…

Hadoop学习3:问题解决

文章目录 问题解决1. ERROR: but there is no HDFS_NAMENODE_USER defined2. JAVA_HOME is not set and could not be found.3. Hadoop-DFS页面访问不了4. namenode格式化失败&#xff0c;或者dfs页面打开失败5. ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Ab…

select for update

在Oracle数据库中&#xff0c;SELECT ... FOR UPDATE 是一种用于锁定查询结果中特定行的方法&#xff0c;它允许你在事务处理过程中确保这些行不会被其他会话修改或者删除&#xff0c;直到当前事务结束&#xff08;无论是通过提交COMMIT还是回滚ROLLBACK&#xff09;。其基本原…

《ElementPlus 与 ElementUI 差异集合》el-input 和 el-button 属性 size 有变化

差异 element-ui el-input 和 el-button 中&#xff0c;属性size 值是 medium / small / minielement-plus el-input 和 el-button 中&#xff0c;属性size 值是 ‘large’ | ‘default’ | ‘small’&#xff1b; 如果你是自动升级&#xff0c;Vue3 系统会有如下警告“ el-b…

工作汇报的10条方法论

​ 写工作汇报&#xff0c;是职场中的必备能力和升迁本领&#xff01;任何管理层都会经历写作和汇报&#xff0c;如何精准写到位&#xff1f;在此&#xff0c;我介绍10条方法&#xff0c;帮助大家领悟其思想精髓&#xff01;一般来说&#xff0c;写作从茫然到胸有成竹&#xff…

机器学习模型—支持向量机 (SVM)

机器学习模型—支持向量机 (SVM) 支持向量机 (SVM) 是一种强大的机器学习算法,用于线性或非线性分类、回归,甚至异常值检测任务。SVM 可用于各种任务,例如文本分类、图像分类、垃圾邮件检测、笔迹识别、基因表达分析、人脸检测和异常检测。SVM 在各种应用中具有适应性和高效…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台&#xff08;包括但不限于.NET Framework 和 .NET Core&#xff09;构建 HTTP 服务的框架&#xff0c;用于创建 RESTful Web 服务。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它利用HT…

前端食堂技术周刊第 115 期:Rolldown 正式开源、马斯克宣布 xAI 本周将开源 Grok、如何使用 Copilot 完成 50% 的日常工作?

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;手打柠檬茶 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看…

【分解质因数】第十二届蓝桥杯省赛第二场C++ A组/B组《完全平方数》(C++)

【题目描述】 一个整数 a 是一个完全平方数&#xff0c;是指它是某一个整数的平方&#xff0c;即存在一个整数 b&#xff0c;使得 ab的平方。 给定一个正整数 n&#xff0c;请找到最小的正整数 x&#xff0c;使得它们的乘积是一个完全平方数。 【输入格式】 输入一行包含一…