请问多核CPU还需要超线程技术吗?还有多核CPU的带宽怎样计算?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问多核CPU还需要超线程技术吗?还有多核CPU的带宽怎样计算?相关的知识,希望对你有一定的参考价值。

超线程是双核以前的技术,可以称之为准双(多)核,但毕竟物理内核只有一个,没发根正真的双核比的。现在物理多核处理器都不带超线程技术了。
带宽就是FSB(前端总线)分2种情况,intel的是外频*4,比如我的P4 2.8外频是200M,FSB=200*4=800M。AMD的cpu内部就集成了内存管理器(以前内存管理器在主板心片里),所以AMD 64位CPU的前端总线FSB频率与CPU实际频率一致。
参考技术A CPU总线带宽=总线频率*位宽/8
超线程技术用处已经不大了。技术进步了,超线程就是在单一的CPU上模拟出两个逻辑处理器,以便提升运行多个线程的效率,但它不是真正的双核,效率比不过多CPU。而现在都是带有两个以上核心的CPU啦,有了真双核还要模拟的双核技术干什么?
参考技术B 你知道了麻烦亦给我说一声。 参考技术C 这问题又带有楼主解决

C++ openmp并行程序在多核linux上如何最大化使用cpu

openmp并行程序在多核linux上最大化使用cpu的方法如下:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>

int main()

    long long i;
    long double sum = .0;
    long double sec = .0;

    // Multi-thread compute start
    clock_t t1 = clock();
    #pragma omp parallel for
    for (i = 0; i < 1000000000; i++)
    
        sum += i/100;
    
    clock_t t2 = clock();

    sec = (t2 - t1);
    //sec = (t2 - t1);
    printf("Program costs %.2Lf clock tick.\\n", sec);
    exit(EXIT_SUCCESS);

以上代码中,#pragma omp parallel for

这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i < 1000000000; i++)这个循环执行过程平均分配给每一个CPU核心。

去掉#pragma omp parallel for这行,则和普通的串行代码效果一致。

注意,要使用openmp功能,在编译的时候需要加上-fopenmp编译参数。

以下是两种编译搭配两种代码出现的4种结果,可以很直观地看到效果:

1、代码里含有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c 

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test 

Program costs 50202611.00 clock tick.


2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test 

Program costs 4068178.00 clock tick.


3、代码里没有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c 

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test 

Program costs 4090744.00 clock tick.


4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c 

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test 

Program costs 4170093.00 clock tick.


可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。

值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。



参考技术A OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。
OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用,在这样的系统上,MPI使用较多。

当然,还有一个更简单的方法就是使用Go语言。本回答被提问者采纳

以上是关于请问多核CPU还需要超线程技术吗?还有多核CPU的带宽怎样计算?的主要内容,如果未能解决你的问题,请参考以下文章

在多核CPU下,同一进程下的多个线程可以并行运行吗

CPU工作方式多核心超线程技术详解[转贴]

同步多线程(超线程)是“真正的”多核处理吗?

单核CPU多线程多核CPU和多个CPU

java能利用多核cpu吗

多线程和CPU的关系