精华内容
下载资源
问答
  • 单核和多核

    千次阅读 2013-08-16 18:09:15
    单核  同步:一件事一件事顺序执行,等待的时候也不去做别... 异步:(异步切换思想),一件事情等待的时候去做另一件事情来度过浪费掉的时间。   多核  同步:没有意义。    异步:  并行:同一件事情可

    单核

           同步:一件事一件事顺序执行,等待的时候也不去做别的事情,就是浪费时间。也不一定,比如有时候,需要独占资源时就需要同步机制,比如多线程经常会遇到的问题。

           异步:(异步切换思想),一件事情等待的时候去做另一件事情来度过浪费掉的时间。

     

    多核

           同步:没有意义。

     

           异步:

                     并行:同一件事情可以有两个核同时执行。

                     非并行:同一件事情必须有一个核单独来完成。

     

    多线程实现的是或者说做的事情是单核中;非独占cpu的业务;异步切换

                                                                          让线程1做的事情中等待的时间做两件事:

                                                                                                                                                让线程1Sleep;

                                                                                                                                                让线程2做另一件事情;

    阻塞:线程被挂起,实现绝对同步;

    非阻塞:不能立刻得到结果之前,不阻塞线程,立刻返回。

     

    多线程应用:

                         网络应用:天生并发性,不确定性,不可靠性,等待交互

                         嵌入式应用:轻量级线程切换,响应快。

    进程:包含程序指令和相关资源的集合,一起参与调度竞争资源

    上下文切换:每次进程切换,都存在进程资源的保护和恢复动作。

     

    展开全文
  • 摘要:电子相册中前后两张图片的切换会产生淡入淡出效果,而且切换过程中需要大量的中间计算过程,而SSE4和多核编程技术能够有效加快中间的计算过程,有效减少图片之间切换时间,本文将对基于SSE4和多核编程的电子...

    基于SSE4和多核编程的电子相册的实现

    基于SSE4和多核编程的电子相册的实现

     

    摘要:电子相册中前后两张图片的切换会产生淡入淡出效果,而且切换过程中需要大量的中间计算过程,而SSE4和多核编程技术能够有效加快中间的计算过程,有效减少图片之间切换时间,本文将对基于SSE4和多核编程的电子相册的实现过程进行详细说明。

    关键词:电子相册;淡入淡出;SSE4;多核编程

    1.  引言

    在电子相册中,前后两张图片,由前一张图片完全切换为后一张图片的过程中,如果将中间结果展现出来的话,就会出现图片的淡入淡出的效果,但是由于像素较高的图片之间切换过程需要大量的计算过程,使用普通的串行程序完成整个切换过程需要消耗较长的时间,而考虑使用SSE4和多核编程将使整个切换过程所需的时间显著减少,本次实验我们具体验证通过使用这两项技术对图片的切换过程产生怎样的影响。

    2.  关键技术

    2.1  SSE4

    SSE4指令集的英文全称是:Streaming SIMD Extensions 4,是英特尔自从SSE2之后对ISA扩展指令集最大的一次的升级扩展。除了将延续多年的32位架构升级至64位之外,还加入了图形、视频编码、字符串/文本处理、三维游戏应用等指令,使得处理器不但在多媒体,而且在文本处理、矢量化编译、特定应用等方面的应用性能都得到了大幅度的提升。新指令集增强了从多媒体应用到高性能计算应用领域的性能,同时还利用一些专用电路实现对于特定应用加速。SSE4.1版本的指令集新增加了47条指令,主要针对向量绘图运算、3D游戏加速、视频编码加速及协同处理的加速。英特尔方面指出,在应用SSE4指令集后,45纳米Penryn核心额外提供了2个不同的32位向量整数乘法运算支持,并且在此基础上还引入了8位无符号最小值和最大值以及16位、32位有符号和无符号的运算,能够有效地改善编译器编译效率,同时提高向量化整数和单精度运算地能力。SSE4.2则是在新一代Nehalem架构基于Core微架构的SSE4.1指令集上,新增的7组指令主要针对字符串和文本处理指令应用。

    2.2  多核编程

    多核编程的基本目的是通过多个任务的并行执行提高应用程序的性能。这就需要将一个应用程序进行任务划分:尽量分解为多个相对独立的任务,每个任务实现一个线程,从而将多个任务分布到多个计算核上执行,减少程序的执行时间。并行程序的设计模式大致分为:并发性发现、算法结构设计、结构支撑和实现机制4个步骤。首先要分析待解决的问题是否值得去并行,然后确定问题的主要特征和数据元素,最后识别问题的哪一部分是计算最密集的。通过算法结构的设计,将并发性映射到多个线程或进程,进一步向并行程序靠近。

    Windows环境下的多线程编程:MFC用类库的方式将Win32API进行封装,提供对多线程的支持。MFC有两种类型的线程:用户界面线程和辅助线程。

    OpenMP是一个针对共享内存架构的多线程编程标准,用于编程可移植的多线程应用程序。OpenMP程序设计模型提供了一组与平台无关的编译指导、指导命令、函数调用和环境变量,显示地指导编译器开发程序中的并行性。对于很多循环来说,都可以在循环体之前插入一条编译指导语句,使其以多线程执行。

    3. 实验思路

    (1) 由于C++可以直接使用内嵌原语,故本实验采用C++语言编写。

    (2) 使用C++的基于对话框的MFC程序实现图像的操作及相应的图像淡入淡出效果。

     4. 实验环境

    (1) 操作系统:win7 32位

    (2) 编程工具:Visual Studio 2017

    (3) 编程语言:C++

    (4) 图片规格:*.BMP格式的文件,分辨率为1280×800

    5.  实验过程及代码实现

    5.1  加载图像到内存

    为了贴合多核思想,本实验所采用的6张图片都是BMP格式的图片,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大,满足实验要求。本实验设置了比较功能,即在普通情况下的图片切换,所以需要两个存储位图的数组,加载图像核心代码如下:

    #define MAX_COUNT 6

    CBitmap bmps[MAX_COUNT];

    CBitmap mmp[MAX_COUNT];

    for (int i = 0; i < MAX_COUNT; i++)

    {

    bmps[i].LoadBitmap(IDB_BITMAP1 + i);

    }

    for (int i = 0; i < MAX_COUNT; i++)

    {

    mmp[i].LoadBitmap(IDB_BITMAP1 + i);

    }

     

    5.2  获取图像的像素点

    在淡入淡出的过程中,需要对像素点进行融合。首先需要获取图像的像素点。核心代码如下:

     

    BITMAP b;             //声明位图文件b

    bmps[m].GetBitmap(&b);   

    //获取第一张图片

    int size = b.bmHeight*b.bmWidthBytes;  //获取位图字节数

    BYTE *lp1 = new BYTE[size];

    bmps[m].GetBitmapBits(size, lp1);   //获取第一张图片的像素列

    BITMAP b2;   //声明位图文件b2

    bmps[n].GetBitmap(&b2);  //获取第二张图片,由于图片大小相等,所以不用重复计算字节数

    BYTE *lp2 = new BYTE[size];

    bmps[n].GetBitmapBits(size, lp2);  //获取第二张图片的像素列

    //GetBitmapBits()函数将指定位图的位拷贝到缓冲区里。

    BYTE *lp3 = new BYTE[size];    //用来显示中间图像

    }

    此方法分别获取图像A和图像B的像素值数列lp1、lp2,并定义lp3用来存储中间图像的像素。

    5.3  实现图像的淡入淡出

    像素点的融合公式:

    Result_pixel=A_pixel×fade+B_pixel×(1-fade)

    将上式做简单变换,减少一次乘法,得:

    Result_pixel=(A_pixel-B_pixel)×fade+B_pixel

    在fade因子从127渐变为0的过程中,产生了一系列A、B融合的中间图像,实现了由A图像淡化到B图像的过程。在实际计算过程中,为了方便计算,fade因子从127渐变为0,计算完成后再右移7位,以此达到从1渐变为0的效果。一个像素为4个字节32位,解紧缩后为4个字64位;SSE4寄存器为128位,可存储8个字,即2个解紧缩后的像素,故可用于同时计算两个像素,加快运行速度。SSE4内嵌原语的使用需在程序加入以下语句:

    #include <nmmintrin.h>

    同时在循环过程中,内层嵌套每次递增8个,即4个两像素同时计算,体现了多核思想,进一步加快了融合速度。

    内层嵌套递增数值的要求:1)为宽度的约数,如本例中宽度为1280,可取4、8等;2)应符合机器128位寄存器个数要求,如本例需使用10个寄存器,8个用于像素值的存储、计算,1个用于fade值的存储(xmm0),1个用于紧缩及解紧缩操作(xmm8),以减少可能的数据及结构冲突。

    在循环开始前,利用#pragma omp parallel for private(4,x)对X进行四线程并行计算,进一步体现了多核思想。

    核心代码如下:

    for (int fade = 127; fade >= 0; fade--) //

    {

    for (int y = 0; y < b.bmHeight; y++)

    {

    #pragma omp parallel forprivatc(4,x) //4线程并行计算

    for (int x = 0; x < b.bmWidth; x = x + 8)  //4个两像素同时计算

    {

    rgb[0] = y*b.bmWidthBytes + x * 4;

    rgb[1] = y*b.bmWidthBytes + (x + 1) * 4;

    rgb[2] = y*b.bmWidthBytes + (x + 2) * 4;

    rgb[3] = y*b.bmWidthBytes + (x + 3) * 4;

    rgb[4] = y*b.bmWidthBytes + (x + 4) * 4;

    rgb[5] = y*b.bmWidthBytes + (x + 5) * 4;

    rgb[6] = y*b.bmWidthBytes + (x + 6) * 4;

    rgb[7] = y*b.bmWidthBytes + (x + 7) * 4;

    //A的两个像素8字节

    pic1[0] = lp1[rgb[0]];

    pic1[1] = lp1[rgb[0] + 1];

    pic1[2] = lp1[rgb[0] + 2];

    pic1[3] = lp1[rgb[0] + 3];

    pic1[4] = lp1[rgb[1]];

    pic1[5] = lp1[rgb[1] + 1];

    pic1[6] = lp1[rgb[1] + 2];

    pic1[7] = lp1[rgb[1] + 3];

    //B的两个像素8字节

    pic2[0] = lp2[rgb[0]];

    pic2[1] = lp2[rgb[0] + 1];

    pic2[2] = lp2[rgb[0] + 2];

    pic2[3] = lp2[rgb[0] + 3];

    pic2[4] = lp2[rgb[1]];

    pic2[5] = lp2[rgb[1] + 1];

    pic2[6] = lp2[rgb[1] + 2];

    pic2[7] = lp2[rgb[1] + 3];

    //余下的3个两像素的定义相同

     

    __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6,xmm7,xmm9;

    __m128i xmm8 = _mm_setzero_si128();

    //初始化寄存器

     

    xmm0 = _mm_set_epi16(fade, fade, fade, fade, fade, fade, fade, fade);

    //8个fade因子装入寄存器

     

    xmm1 = _mm_loadu_si128((__m128i*)pic1);//A的两个像素分量装入寄存器

    xmm1 = _mm_unpacklo_epi8(xmm1, xmm8);//8个一位解紧缩至16位

    xmm2 = _mm_loadu_si128((__m128i*)pic2);//B的两个像素分量装入寄存器

    xmm2 = _mm_unpacklo_epi8(xmm2, xmm8);//8个一位解紧缩至16位

    xmm1 = _mm_sub_epi16(xmm1, xmm2);   //A-B

    xmm1 = _mm_mullo_epi16(xmm1, xmm0);//8个16位乘法

    xmm1 = _mm_srai_epi16(xmm1, 7);//右移7位,相当于除127

    xmm1 = _mm_add_epi16(xmm1, xmm2);//加法

    xmm1 = _mm_packus_epi16(xmm1,xmm8);//16个一位紧缩为8位

    //依次提取每个整型,放入待显示像素数组

    lp3[rgb[0]] = _mm_extract_epi8(xmm1, 0);

    lp3[rgb[0] + 1] = _mm_extract_epi8(xmm1, 1);

    lp3[rgb[0] + 2] = _mm_extract_epi8(xmm1, 2);

    lp3[rgb[0] + 3] = _mm_extract_epi8(xmm1, 3);

    lp3[rgb[1]] = _mm_extract_epi8(xmm1, 4);

    lp3[rgb[1] + 1] = _mm_extract_epi8(xmm1, 5);

    lp3[rgb[1] + 2] = _mm_extract_epi8(xmm1, 6);

    lp3[rgb[1] + 3] = _mm_extract_epi8(xmm1, 7);

                  //余下3个两像素的计算类似

    }

    }

    bitmap.SetBitmapBits(size, lp3);

    Ondraw();

    }

    delete lp1;

    delete lp2;

    delete lp3;

    }

     源码下载:https://github.com/lyj8330328/Album

    posted @ 2018-03-05 09:02 雨落忧伤- 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 在 CPU 多核的环境中,一个线程先在一个 CPU 核上运行,之后又切换到另一个 CPU 核上运行,这时就会发生 context switch。 当 context switch 发生后,Redis 主线程的运行时信息需要被重新加载到另一个 CPU 核上,...

    多核CPU和多CPU对redis的影响:

    在 CPU 多核的环境中,一个线程先在一个 CPU 核上运行,之后又切换到另一个 CPU 核上运行,这时就会发生 context switch。

    当 context switch 发生后,Redis 主线程的运行时信息需要被重新加载到另一个 CPU 核上,而且,此时,另一个 CPU 核上的 L1、L2 缓存中,并没有 Redis 实例之前运行时频繁访问的指令和数据,所以,这些指令和数据都需要重新从 L3 缓存,甚至是内存中加载。这个重新加载的过程是需要花费一定时间的。

    多核CPU:

    多核cpu架构

    在多核 CPU 的场景下,一旦应用程序需要在一个新的 CPU 核上运行,那么,运行时信息就需要重新加载到新的 CPU 核上。而且,新的 CPU 核的 L1、L2 缓存也需要重新加载数据和指令,这会导致程序的运行时间增加!

    解决的办法

    讲过Redis示例和CPU指定的一个核绑定起来
    可以使用taskset -c 0 ./redis-server命令
    意思是将Redis示例绑定到了 0 号CPU核上;

    但这样也会存在一个问题,主线程,子进程,后台线程会竞争激烈,可能导致阻塞问题;

    加入一个物理核有6个逻辑核,现在又2个物理核,我们需要绑定到一个物理核上!

    taskset -c 0,6 ./redis-server 这样主线程,子进程 和 后台线程等竞争想对来说不会那么激烈;

    尽量将Redis示例绑定在一个物理核上,而不是一个逻辑核
    绑核不仅对降低尾延迟有好处,同样也能降低平均延迟、提升吞吐率,进而提升 Redis 性能;

    多CPU

    网络中断程序:网络中断程序是要和 Redis 实例进行网络数据交互的;

    多CPU请况下,每个CPU又存在多个核,这种情况下,需要夸CPU Socket进行访问,这期间需要建立连接,然后又需要去物理核,逻辑核上进行访问数据,会导致 Redis 处理请求的延迟增加;

    在这里插入图片描述

    如果网络中断处理程序和 Redis 实例各自所绑的 CPU 核不在同一个 CPU Socket 上,那么,Redis 实例读取网络数据时,就需要跨 CPU Socket 访问内存,这个过程会花费较多时间。

    所以为了避免 Redis 跨 CPU Socket 访问网络数据,需要将网络中断程序和 Redis 实例绑在同一个 CPU Socket 上;

    展开全文
  • 多线程与多核处理器 SMP 分析

    千次阅读 2014-04-29 09:38:53
    4、交互式程序可以通过多线程方式改善响应时间。 多线程实现的方式: 1、程序采用多线程设计方案; 2、多核处理器为单一的单线程程序提供了很好的平台,对其进行并行优化,是吸纳实现更好的程序运行效 ...

    首先分析线程的优势:

    1、提高程序的并发性(线程级并行,而非指令级并行);
    2、一个进程内的所有线程共享所有资源;
    3、切换线程的代价下;
    4、交互式程序可以通过多线程方式改善响应时间。


    多线程实现的方式:
    1、程序采用多线程设计方案;
    2、多核处理器为单一的单线程程序提供了很好的平台,对其进行并行优化,是吸纳实现更好的程序运行效果。


    当一个采用多线程设计的程序在SMP平台上运行时,进程中的多线程会分布到CPU的多个核上并行执行。如果线程间的执行过程是独立的,则此时的进程的并行度是最大的,如果多线程间存在资源的竞争或者需要同步和通信,其进程的并行度<1。如果多个线程的结构是顺序结构且临界资源数为1时,此时的多线程设计方案则会退化为单线程设计模式,其程序的效率大打折扣。


    展开全文
  • 在单个 CPU 核上,线程通过时间片或者让出控制权来实现任务切换,达到 "同时" 运⾏多个任务的⺫的,这就是所谓的并发。但实际上任何时刻都只有一个任务被执行,其他任务通过某种算法来排队。多核 CPU 可以让同⼀进程...
  • 1.多线程在单核和多核CPU上的执行效率问题...a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实...
  • a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑 ...
  • 多核编程 与 单核多线程编程的区别

    万次阅读 2017-05-14 14:06:51
     使用多线程来实现并行计算来缩短计算时间时,只要在多核CPU下才行,单核CPU下启用多线程最终总的计算计算一样,因为CPU在同一时间,只能服务于一个线程, 在单核CPU下运用多线程仅仅能实现快速响应用户的请求,...
  • 作为一个程序员,线程,进程,协程这些是我们必须要掌握的...而并行指的是同一时刻,强调的是同一个时间点并行运行,很显然,并行要求需要多核,而并发可以单核切换运行程序,由于cpu的高速运转,所以看起来并发很类...
  • 1.多线程在单核和多核CPU上的执行效率问题的讨论a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢)多个cpu的话就可以在两个cpu中同时执行了..............a2: ...
  • 多核多线程 自旋锁(spinlock )与 互斥量(mutex) mutex方式: Mutex适合对锁操作非常频繁的场景,并且具有更好的适应性。 尽管相比spin lock它会花费更多的开销(主要是上下文切换),但是它能适合实际开发...
  • 1.多线程在单核和多核CPU上的执行效率问题的讨论a1:多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢)多个cpu的话就可以在两个cpu中同时执行了.............. ...
  • 多核CPU开几个线程最好

    千次阅读 2015-05-18 10:03:37
    IO开销较多的应用其CPU线程等待时间会比较长,所以线程数量可以开的多一些,相反则线程数量要少一些,其实有两种极端,纯IO的应用,比如proxy,则线程数量可以开到非常大(实在太大了则需要考虑线程切换的开销)
  • 转自 1.多线程在单核和多核CPU上的执行效率...a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, ...
  • 并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长ps:在介绍进程理论时,提及进程的...
  • 单核CPU如何执行多线程 1.(单核CPU)同一时间,cpu只能...1.A执行到度某一时间段要切换了,可A任务没完成,系统就会把A当前执行的位置和数据以入栈的方式保存起来 2.然后B线程执行,B执行时间到了,它的位置状态等也会被
  • 线程的切换、调度,线程数据的同步,都须要消耗系统时间。线程越多,消耗越多。同时伴随引发的CPU的流水线清空,每次清空也将导致数十个时钟周期的浪费。虽然在以线程为单位进行调度的操作系统下,多线程能争取到更...
  • 并发:指单核CPU通过快速切换时间片方式,处理大量时间,营造出时间被并行处理的假象(因为CPU处理速度远大于其他环节(寄存器环境配置环节)的处理速度),实质上cpu仍然是只能做一件事。 并行:指多核CPU在同一...
  • 基础知识: 硬件部分:Leon3。 OpenRISC:开源处理器,verilog所写出来,32位的处理器。 LEON:欧洲航天局的32位开源...评价RTOS的重要指标:任务切换时间->切换时间,中断延时时间->对外界反应的速度。 uS/OS-II
  • 因为GIL(Global Interpreter Lock(全局解释器锁))存在,且一个CPU同一时间只能执行一个线程(单核多线程为并发而非并行)。每个线程执行方式:获取GIL →I/O或操作达到阈值 → 释放GILCPU密集操作,计数快速达到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 662
精华内容 264
关键字:

多核时间切换