精华内容
下载资源
问答
  • 多核并行计算——并发与并行编程问题
    2021-05-21 01:30:41

    并发是用来描述并行执行的方式(看上去一起发生的事件,例如目前操作系统的多任务调度程序,看上去桌面上有许多程序在同时运行.),并发是形容词.

    并行是指通过并发将一个操作分解成一组粒度更细的工作单元,并且这些工作单元可以在不同的处理器内核上运行.并行是动词,指必须有两个以上的事件发生.

    工作单元,以粒度可分为最小到单一CPU指令,大到函数或系统任务.

    并行有数据并行性与任务并行性

    数据并行性指对许多数据执行相同的并行操作,比如对一组数的每个数进行加法操作.

    任务并行性指对相同的一组数据执行不同的并行操作,比如一个执行加法操作,而另一个执行乘法操作.

    优秀的多核微处理器:AMD Multicore Opteron、Intel Core2 Duo

    并行编程的麻烦

    内存一致模型简称内存模型

    缓存一致性(cache coherency) 将缓存与主内存数据进行同步

    内存一致性模型(memory consistency model)

    CPU可以对内存的读取或写入操作重新排序(乱序执行Out of Order),而导致内存一致性的产生.就是指CPU中实际内存访问操作与程序代码中内存访问操作的不一致性程度.

    CPU的硬件架构决定了内存模型的强度,强度越高写代码就会更容易.

    x86/64架构的CPU有较强的内存一致性模型,而安腾系列处理器Itanium(IA-64)是较弱的模型.它为了提高性能(不必根踪缓存行的状态)不会主动刷新缓存,而是提供指令操作缓存刷新到主内存.

    还有一些软件实现的内存模型,比如java虚拟机和.NET CLR,它们都是比较强的内存模型,而且不考虑具体的硬件实现.

    解决办法:内存栅栏(memory fence)

    内存栅栏可以阻止目标架构对指令进行重排.利用语言平台的特性或原子方法可以实现内存栅栏,比如.net中的Interlocked类方法,c++中的volatile变量.

    附录一些并行库:

    Single Unix Specification的POSIX线程库.

    Intel的TBB线程库.

    Standard Template Adaptive Parallel Library,STAPL:标准模板适配并行库.

    最后并行编程库必须得到操作系统的支持,如果系统没有相应功能api,上面那些并行库也就一无是处了.

    更多相关内容
  • C语言多线程

    2021-05-25 08:55:29
    线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,...

    什么是线程,线程的优点是什么

    线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。

    线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,完成相关任务的不同代码间需要交换数据。如果采用多进程的方式,那么通信就需要在用户空间和内核空间进行频繁的切换,开销很大。但是如果使用多线程的方式,因为可以使用共享的全局变量,所以线程间的通信(数据交换)变得非常高效。

    Hello World(线程创建、结束、等待)

    创建线程 pthread_create

    线程创建函数包含四个变量,分别为: 1. 一个线程变量名,被创建线程的标识 2. 线程的属性指针,缺省为NULL即可 3. 被创建线程的程序代码 4. 程序代码的参数 For example: – pthread_t thrd1; – pthread_attr_t attr; – void thread_function(voidargument); – char *some_argument;

    pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument);

    结束线程 pthread_exit

    线程结束调用实例:pthread_exit(void *retval); //retval用于存放线程结束的退出状态

    线程等待 pthread_join

    pthread_create调用成功以后,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度,如果我们需要等待指定线程结束,需要使用pthread_join函数,这个函数实际上类似与多进程编程中的waitpid。 举个例子,以下假设 A 线程调用 pthread_join 试图去操作B线程,该函数将A线程阻塞,直到B线程退出,当B线程退出以后,A线程会收集B线程的返回码。 该函数包含两个参数:

    pthread_t th //th是要等待结束的线程的标识

    void **thread_return //指针thread_return指向的位置存放的是终止线程的返回状态。

    调用实例:pthread_join(thrd1, NULL);

    #include #include#include#include

    void print_message_function (void *ptr);intmain()

    {inttmp1, tmp2;void *retval;

    pthread_t thread1, thread2;char *message1 = "thread1";char *message2 = "thread2";intret_thrd1, ret_thrd2;

    ret_thrd1= pthread_create(&thread1, NULL, (void *)&print_message_function, (void *) message1);

    ret_thrd2= pthread_create(&thread2, NULL, (void *)&print_message_function, (void *) message2);//线程创建成功,返回0,失败返回失败号

    if (ret_thrd1 != 0) {

    printf("线程1创建失败\n");

    }else{

    printf("线程1创建成功\n");

    }if (ret_thrd2 != 0) {

    printf("线程2创建失败\n");

    }else{

    printf("线程2创建成功\n");

    }//同样,pthread_join的返回值成功为0

    tmp1 = pthread_join(thread1, &retval);//printf("thread1 return value(retval) is %d\n", (int)retval);

    printf("thread1 return value(tmp) is %d\n", tmp1);if (tmp1 != 0) {

    printf("cannot join with thread1\n");

    }

    printf("thread1 end\n");

    tmp2= pthread_join(thread2, &retval);//printf("thread2 return value(retval) is %d\n", (int)retval);

    printf("thread2 return value(tmp) is %d\n", tmp1);if (tmp2 != 0) {

    printf("cannot join with thread2\n");

    }

    printf("thread2 end\n");

    }void print_message_function( void *ptr ) {int i = 0;for (i; i<5; i++) {

    sleep(3);

    printf("%s:%d\n", (char *)ptr, i);

    }

    }

    编译:

    gcc duojincheng.c -o a -lpthread

    如果不加-lpthread会报错:

    /tmp/ccAfHhhZ.o:在函数‘main’中:

    duojincheng.c:(.text+0x40):对‘pthread_create’未定义的引用

    duojincheng.c:(.text+0x60):对‘pthread_create’未定义的引用

    duojincheng.c:(.text+0xae):对‘pthread_join’未定义的引用

    duojincheng.c:(.text+0xf2):对‘pthread_join’未定义的引用

    collect2: error: ld returned 1 exit status

    运行结果:

    线程1创建成功

    线程2创建成功

    thread2:0thread1:0thread2:1thread1:1thread2:2thread1:2thread1:3thread2:3thread1:4thread1return value(tmp) is 0thread1 end

    thread2:4thread2return value(tmp) is 0thread2 end

    原文链接:https://www.cnblogs.com/pfeiliu/p/13237185.html

    本文来自网络,不代表手讯网立场。

    展开全文
  • 1. 单核和多核CPU上多线程执行效率的探讨a1: 多线程实际上是在单个CPU中按顺序执行的,但是系统可以帮助您切换该执行,但是它不是很快的(相反,是缓慢的)如果有多个cpus,则可以同时在两个cpus中执行.........a2: 在...

    88011b6b85de1f5b10cfbfa2e6e5fd50.png

    1. 单核和多核CPU上多线程执行效率的探讨

    a1: 多线程实际上是在单个CPU中按顺序执行的,但是系统可以帮助您切换该执行,但是它不是很快的(相反,是缓慢的)

    如果有多个cpus,则可以同时在两个cpus中执行.........

    a2: 在单核CPU上运行的多线程程序. 只能同时运行一个线程. 该系统可帮助您切换线程. 系统将时间片分配给每个线程以执行. 每个时间片约为10毫秒. 它似乎同时运行,但实际上每个线程都会运行一点,然后切换到其他线程以继续运行

    效率不会提高

    切换线程会增加开销

    a3: #3F说的是正确的. 因此,不建议不要使用多线程,尤其是在单核CPU上.

    e3903b2d4c850c85d83c7d7e76bae061.png

    使用单核CPU时使用多线程. 通常,有线程在等待.

    对于常见的进度条更新类型,可以简单地控制那些可以简单控制的类型(例如: 在循环中手动处理消息). 通常,不使用线程,这可以提高程序的性能. 并避免不必要的线程同步问题.

    a4: 您可以尝试双核和三线程,但是准确性低于双线程!

    对于相同的算法,CPU占用率为100%的最小线程数是最有效的. 如果CPU占用率很高,则最适合使用单核单线程,双核双线程,四核和四线程.

    但是,为什么有时线程数超过CPU内核数会更快?原因是此类程序的单线程操作量不足以占用CPU的一个核心(例如,IO操作很多,IO相对较慢,这是程序的瓶颈)

    a5: 使用多线程是在执行耗时的操作时,您需要等待返回结果. 这时,多线程可以提高程序的并发程度. 如果不需要等待并执行可以顺序完成的任务,那么使用多个线程就是一种浪费.

    2. 谈论多核CPU,多线程和并行计算

    e18cc3fb52b65247868743022a489ebc.png

    a1: CPU发展趋势

    核心数将继续增加. 根据摩尔定律,由于单核性能提高的严重瓶颈问题,到2017年底和2018年初,普通台式PC有望达到24核(或16核和32线程). 我们如何应对这种突然增长在核心数上?编程还必须与时俱进. 作者大胆地预测,CPU内核之间的片上总线将以4路组连接: ),因为完全连接太复杂,并且单条总线还不够. 而且它应该是一个不对称的多核处理器,可以与多个DSP处理器或流处理器混合使用.

    a2: 线程越多越好?何时需要使用多线程?

    线程不得尽可能多. 线程切换也很昂贵. 添加线程时,增加的开销少于线程可以消除的阻塞时间,这是值得的.

    自2.6内核以来,Linux为不同的内核提供了不同的线程进行处理. 从NT.4.0开始,Windows也支持此功能.

    何时应使用多线程?应该在四种情况下对此进行讨论:

    a. 多核CPU密集型任务. 这时,请尝试使用多线程来提高任务执行效率,例如加密和解密,数据压缩和解压缩(视频,音频,普通数据),否则只能加载一个核心,而其他核心则处于空闲状态

    5ef5c3e2373cde8e198e9b7d9ae7f124.png

    b. 单核CPU密集型任务. 此时的任务已消耗了100%的CPU资源,并且没有必要也没有可能使用多线程来提高计算效率;相反,如果要进行人机交互,最好使用多线程,以防止用户无法与计算机交互. 继续.

    c. 单核CPU-IO密集型任务,使用多线程是为了方便人机交互,

    d. 更不用说多核CPU-IO密集型任务,原因与单核时相同.

    4. 程序员需要掌握的技能/技术

    (1)减少序列化代码以提高效率. 这是胡说八道.

    (2)单个共享数据分发: 复制一个数据的多个副本,以便不同的线程可以同时访问它.

    (3)负载平衡可以分为静态和动态. 有关详细信息,请参阅相关文献.

    a1c8695fb46c0edb_0.jpg

    3. 请问: CPU多核与应用程序多线程之间是什么关系?

    a1: 多核意味着系统可以同时运行多个线程. 例如,双核可以同时执行两个线程. 单个内核一次只能执行一个线程.

    a2: 我尝试了从192.168.0.1到192.169.0.255的ping程序

    它是通过多线程完成的,发现单核计算机和多核计算机之间的性能差异大约是两倍.

    a3: 多核对用户是透明的. 应该说,它对程序员是透明的. 您完全不必担心. 当您使用单核编程时,就可以了. 除非使用OpenMP进行编程,否则将使用很多限制. 您的上述测试不准确. 网络(主要是远程主机)在不同时间将具有不同的响应速度. 您应该在干净的本地计算机和相同的环境中进行测试. 但是,对于多线程多核要优于单核这还是可以肯定的. 简而言之,我们不必担心该程序在单核或多核上的并发问题.

    a4: 多核是指具有多个核的CPU,并且多线程意味着程序具有同时执行的多个线程.

    多核还需要使用多线程来利用.

    类似地,多线程只能在多核上具有真正的优势.

    在这方面,它对程序员不是透明的. 程序员可以控制程序/线程在哪个CPU(内核)上运行. 用户还可以控制程序在哪个内核上运行. 因此,多核和多线程对用户和程序员而言并不透明. 程序员必须了解这一知识. 为了使程序最大化机器的性能.

    原始链接

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/shoujiruanjian/article-299307-1.html

    展开全文
  • 多核编程实例

    2012-03-15 14:40:27
    使用C/C++语言进行多核编程的实例,由简到难,适合初学者参考学习。
  • 多核并行计算:C语言Pthreads线程库小记 在多核并行计算中,采用Pthreads进行共享内存编程,这篇笔记文章是对Pthreads库的小记。 对象 pthread_t pthread_t对象是一个不透明对象,对象存储的数据由系统绑定,用户级...

    多核并行计算:C语言Pthreads线程库小记

    在多核并行计算中,采用Pthreads进行共享内存编程,这篇笔记文章是对Pthreads库的小记。

    对象

    pthread_t

    pthread_t对象是一个不透明对象,对象存储的数据由系统绑定,用户级代码无法直接访问,pthread_t对象可以对他所从属的对象进行唯一的标识。

    方法

    pthread_create

    pthread_create用来生成线程,它的语法为:

    int pthread_create(
    	pthread_t* thread_p        /*out*/,
    	const pthread_attr_t* attr_p             /*in*/,
    	void* (*start_routine)(void*)             /*in*/,
    	void* arg_p                                                /*in*/,
    );
    

    第一个参数是指向pthread_t对象的指针,必须在调用pthread_create函数前就为pthread_t对象分配好内存空间第二个参数为线程的属性,一般不用;第三个参数为该线程需要运行的函数;最后一个是一个指针,指向传递给start_routine的参数。函数的返回值大多数表示线程调用中是否有错误。

    pthread_join

    pthread_join用来等待pthread_t相关联的那个线程结束。pthread_join函数的结构为:

    int pthread_join(
    	pthread_t thread		/*in*/,
    	void** ret_val_p		/*out*/,
    );
    

    第二个参数可以接收任意由pthread_t对象所关联的那个线程产生的返回值。

    展开全文
  • 多核编程 - 常用策略

    2020-11-17 19:41:17
    任务划分原子化,尽量变量多核间频繁交互。 多核任务,要分配均匀,避免负载不均衡。 多核编程容易出现问题:多核锁竞争,导致核等待。没有充分利用资源。 TBD.
  • 多核并行编程的背景在摩尔定律失效之前,提升处理器性能通过主频提升、硬件超线程等技术就能满足应用需要。随着主频提升慢慢接近撞上光速这道墙,摩尔定律开始逐渐失效,多核集成为处理器性能提升的主流手段。现在...
  • 2:调试和测试多核编程的方法与技术;3:如何使用跨下台技术米利用处理器的特定特性;4:操作系统在多核编程中的任务;5:将框架类作为并发构建块加以利用的方法;6:如何通过使用接口类宋降低任务同步和通信的复杂...
  • 问题描述 梅森数(Mersenne Prime)指的是形如2n-1的正整数,其中指数n是素数,即为Mn。如果一个梅森数是素数,则称其为梅森素数。例如22-1=3、23-1=7都是梅森素数。 当n=2,3,5,7时,Mn 都是素数,但n=11时,Mn=...
  • 协程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核编程语言如golang rust-lang等采用作为并发的基本单位。 协程可以被认为是一种用户空间线程,与传统...
  • 基于SSE4和多核编程的电子相册的实现 1. 内附文档、运行结果与代码; 2. 使用Java和C++; 3. 通过JNI实现Java对C++生成的动态链接库进行调用,可以通过下载学习内容。 代码介绍 使用SSE4指令集及多核思想实现一个...
  • } 在Viewdidload函数中,Mytest直接变成了0x28 = 40 证明一部分C语言的函数,会被直接优化转化成结果直接赋值 大概编译器优化的规则 所有常量的运算的过程都会优化掉,直接生成结果 能够直接从地址中获取值的变量、...
  • 多核编程之流水线技术

    千次阅读 2010-07-08 09:29:00
    多核编程之流水线技术
  • 多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与...
  • 为了使大学生或软件开发人员在...线程编程时有一本好的参考手册,同时为高等学校计算机专业的师生进 行多核多线程程序教学时提供一本有价值的参考书,英特尔软件学院 联合大学教师编纂了这本《英特尔多核/多线程技术》。
  • 原标题:【模型工具】一种对SWMM5的多核优化 原文题目: Parallel flow routing in SWMM 5作者:G. Burger, R. Sitzenfrei, M. Kleidorfer, W. Rauch第一作者单位:Unit of Environmental Engineering, University ...
  • Linux下c语言多线程编程

    千次阅读 2022-03-30 14:09:16
    创建线程函数pthread_create()和等待线程函数pthread_join()的用法。 注意:在创建线程pthread_create()之前,要先定义线程标识符: pthread_t 自定义线程名;...https://blog.csdn.net/qq_34827674/article/details/108608566?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164868779716781685333883%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164868779716781685333883&biz_id=0&spm=1018.2226.3001.4187 多核的假共享的概念False sharing 为了避免假共享...
  • 多核编程技术好书推荐

    千次阅读 2013-11-15 16:52:06
    多核程序设计技术——通过软件多线程提升性能 , 作 者: (孟加拉)阿克特(Akhter,S.),(美)罗伯茨(Roberts,J.) 著,...第二部分包括第5章和第6章,其中讨论用于编写并行程序的常用编程API:第三部分
  • 并行程序设计方法的全面介绍,详细权威,从分析、设计到编程
  • 多核处理器的应用将为设备制造厂商解决复杂和成本问题并快速开发丰富多样的功能找到新的有效途径,对多核编程和调试的支持力度也正在日益增加。实时操作系统(RTOS)和工具供应商正在不断改进以模型为主导的设计、虚拟...
  • 作者: 侯思松 (1 篇文章) 日期: 五月 5, 2009 在 5:18 ...tag:多线程,并行计算,OpenMP,多核编程,工作线程池 ( 2008.01.19 更新 鉴于读者反映代码阅读困难,重新改写了文章和实现,使文章更易读 ) ( 2007.
  • 原标题:大神教你如何用C语言实现科学计算器用C实现的科学计算器使用C语言写的科学计算器,可以实现四则运算、三角函数运算、指对数运算;优先级正确;能智能屏蔽空格,能识别输入错误和运算错误,能实现继续运算、...
  • 多核编程学习笔记之同步(一)——采用Win32线程API实现 分布式2010-03-17 09:50:35阅读66评论0 字号:大中小 订阅 I. 务虚 1.1 总体介绍  在Windows平台下可以通过Windows的线程库来实现...
  • 多核程序设计实验报告 实验一 Windows多线程编程 一、实验目的与要求 了解windows多线程编程机制 掌握线程同步的方法 二、实验环境和软件 Windows XP VC 6.0 三、实验内容 1.创建线程: HANDLE CreateThread ( ...
  • } 测试如下 $ gcc test.c $ ./a.out 9801 python对C语言扩展的支持 很多编程语言都为C语言扩展添加了支持,这有两种原因:(1)语言设计之初,可以充分的利用C语言已有的库来做很多扩展;(2)C语言的运行效率高。 ...
  • C语言多线程编程

    千次阅读 2020-05-16 17:49:29
    线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,...
  • 北邮2021计导大作业的第二部分,多核版cpu模拟器。
  • Python虽有GIL的问题导致多线程无法充分利用多核,但后来的multiprocess可以从多进程的角度来利用多核,甚至affinity可以绑定具体的CPU核,这个问题也算得到解决。虽基本为全栈语言,但有的时候...
  • 申明:本学习笔记是在该教程的基础上结合自己的学习情况进行的总结,不是原创,想要看原版的请看C语言中文网的多线程编程C语言+Linux),该网站有很多好的编程学习教程,尤其是关于C语言的。 通过阅读前面章节,...
  • 牟晓东我们在使用电脑时,可以在播放音乐的...几乎所有的编程语言都提供有“多线程”编程方式,比如在Python中是通过threading模块来创建线程和调用方法来实现多线程的,但对于很多初学者(比如中学生)而言这是有一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,105
精华内容 4,042
关键字:

c语言多核编程