《编写高质量代码:改善c程序代码的125个建议》——建议21:适当地使用并行代码来优化for循环

简介:

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第3章,建议21,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议21:适当地使用并行代码来优化for循环

在实际编程中,尽量把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链,如下面的示例代码所示:

double num[100];
double sum=0; 
int i=0; 
for (i=0;i<100;i++) 
{
    sum += num[i]; 
}

很显然,在上面的代码中要执行100次for循环语句。然而,对于这样的代码,我们可以使用分解成多路的形式进行优化。在这里,我们选择将上面的程序分解成4路,即使用4段流水线浮点加法,浮点加法的每一个段占用一个时钟周期,从而保证最大的资源利用率,如下面的示例代码所示:

double num[100];
double sum=0;
double sum1=0;
double sum2=0;
double sum3=0;
double sum4=0; 
int i=0; 
for(i=0;i<100;i+=4) 
{ 
    sum1 += num[i]; 
    sum2 += num[i+1]; 
    sum3 += num[i+2]; 
    sum4 += num[i+3]; 
} 
sum = sum4+sum3+sum2+sum1;

最后还需要说明的是,由上面的代码可以看出,因为浮点数的精确度问题,在一些情况下,这些优化可能会导致意料之外的结果。但在大部分情况下,最后结果可能只有最低位存在错误。因此,对计算结果正确性的影响不大。

相关文章
|
算法 程序员 C语言
C/C++原子操作与atomic CAS底层实现原理
假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。
1047 1
C/C++原子操作与atomic CAS底层实现原理
|
9月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1191 14
|
9月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
629 20
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
505 3
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
消息中间件 Linux API
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
747 1
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
|
程序员 编译器 C语言
C语言----动态内存分配(malloc calloc relloc free)超全知识点
C语言----动态内存分配(malloc calloc relloc free)超全知识点
1431 6
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
643 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
XML API C语言
深入对比XML处理库:Mini-XML、TinyXML-2与libxml2
深入对比XML处理库:Mini-XML、TinyXML-2与libxml2
918 2