写出高性能的多核并行编程

什么样的程序运行效率高?

程序的数据和指令都在cache中。没有cache miss出现。

所以怎样让并行程序性能高基本能够演变成 怎样降低cache miss?

尤其是多核下。并行程序cache的问题已经无法回避了,否则并行的效率还没有一个线程高。

敲代码的时候MESI协议要时刻浮如今眼前。

借用一句歌词:如今不是从前了,兔子比狐狸狡猾了。

1.绞尽全部的脑汁,避免使用全局变量,尤其是程序执行过程中可能改动的变量。

全部线程仅仅读的变量能够放松一丁点儿要求。

2.per thread per core。每一个core执行一个线程。每一个线程执行在一个cpu core上。

3.Keep data structures  per core。

每一个core只改动自己的数据结构。

4.Keep data structures cache alignment。

保证结构体定义的时候cache line对齐。

能够自己加入pad,也能够用gcc提供的__attribute__。

5.避免false sharing。定义数据结构的时候不能这么搞: int num[CPU_NUMS],这样在for循环中对num[i]++的时候就会造成false sharing。这也是为什么结构体定义要cache line对齐。

6. Lock-free data structures。锁的代价是巨大的。搞不好还会死锁,多核间通信用lock-free fifo。

7.cpu affinity。线程创建后马上绑定到详细的core上,然后再 进行分配内存,保证内存分配在自己的领土这边。

8.分支预測。

使用gcc提供的likely和unlikely。

9.公共子表达式消除。一个函数中假设多次用到同一个表达式,能够開始的时候定义一个指针。

10.循环中消除指针引用。比方以下这样:

for(i=0; i< 1000; i++)

{

*dest++;

}

能够先定义一个局部变量进行累加。最后再把局部变量赋值给指针。

11.X86平台intel提供了非常多的sse指令,尤其是在字符串的搜索和查找方面。

12.多用perf tool。

临时想到的先记录下来,找个时间给出详细的代码逐条举例说明一下。

很多其它更好的文章在个人独立博客: www.hiyoufu.com

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-07-30 07:07:33

写出高性能的多核并行编程的相关文章

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

多核并行编程方法

在多核的硬件结构中,如果要充分发挥硬件的性能,必须采用多线程(或多进程)执行,以提高CPU的利用率.多核系统的编程模型和多个CPU的SMP系统的编程模型是一致的,都属于共享存储的编程模型:同时,多核环境中也可以使用的分布式编程模型.目前,多核并行编程方法可以分为以下四类:基于Raw Thread API的方法.基于共享内存编程模型的方法.基于高层次模板库的方法.基于分布式编程的方法.(1)基于Raw Thread API的方法:这种方法主要使用系统底层API来进行多线程编程.Windows Th

如何写出高性能的SQL语句(转)

高性能的SQL语句能提高页面的执行效率,让你的服务器运行的更为流畅,所以大家在以后的使用过程中,尽量的考虑到效率. (1)整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) (2)删除重复记录: 最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP

五种主要多核并行编程方法分析与比较

随着多核时代的到来与流行,传统的单线程串行程序的编程模式必将改变,取而代之的将是并行编程.目前已经有五种主要并行编程模型,下面将对此五种模型进行概括性的分析与比较: 1. MPI MPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个库,而不是一门实现语言,支持C/C++/Fortran.是一种消息传递编程模型,为进程间通信服务.MPI提供了一种与平台无关,可以被广泛使用的编写消息传递程序的标准.用它来编写消息传递程序,不仅实用.可移植.高效和灵活,而且和

如何写出高性能的.net程序

本文是一个小工作总结. 总结这么久的性能优化经验. 有一次电话面试, 面试官说我简历里提到了性能优化, 他问我性能优化有什么章法吗?给他说说. 我当时真迷糊了. 真的,做了这么久的性能优化还真不知道性能优化有什么章法. 一直是自己凭感觉乱弄, 运气比较好, 还真的可以弄到点子上, 运行时间急剧缩短. 一提起优化, 大家第一反应就是算法. 不过说来惭愧, 我这种懒人, 对算法最一头雾水了, 算法导论买回来看了前几页就扔那压东西了, 现在好像还丢了. 不知道哪次搬家弄没了. 所以本文的主要核心就是如

如何写出高性能的sql语句?

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHER

多核并行编程技术(一)

首先需要先理解几个概念:串行:最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文,单进程/单线程程序可以认为是串行程序.并发:多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对应的多个调用栈.逻辑上多个线程同时发生,物理上是有操作系统调度,CPU某一时刻依然只执行一个线程的任务,但是某个执行中的线程随时可能被OS调度走,而随后运行的线程操作的数据可能跟刚刚被调度走的线程造成冲突,所以有共享数据同步问题. 多进程如果有共享数据,也符合并发程序的

如何写出高性能的SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择"索引查找"方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 "全表扫描"方式. 可见,执行计划并不是固定的,它是"个性化的".产生一个正确的"执行计划"有两点很重要:

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的”.产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)