首页 > 编程语言 >多线程的那点儿事(之多核编程)

多线程的那点儿事(之多核编程)

时间:2022-11-23 13:02:43浏览次数:57  
标签:多线程 int 之多核 编程 bytes value 多核 total

    多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照​​维基百科​​的相关解释。


    open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核上面同时执行,从而可以达到快速执行代码的目的。比如说,我们可以编写一个简单的例子。


    在编写open-mp程序之前,朋友们应该注意下面三点,

    (1) 使用vs2005或者以上的版本编写open-mp程序;

    (2) 编写程序的时候,选择【Property Pages】->【Configuration Properties】->【c/c++】->【language】->【OpenMp Support】,打开开关;       

    (3) 添加#include <omp.h> 声明。



    首先,我们编写简单的一个打印程序,看看结果。

#include <omp.h>

void print()
{
int i;
#pragma omp parallel for
for(i = 0; i < 100; i ++)
{
printf("%d\n", i);
}
}

    上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈,

openmp.exe!print$omp$1()  Line 14 C++
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0x19c bytes
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0xe0 bytes
vcompd.dll!_InvokeThreadTeam@12() + 0x98 bytes
vcompd.dll!__vcomp_fork() + 0x1cd bytes
openmp.exe!print() Line 11 + 0xe bytes C++
openmp.exe!wmain(int argc=1, wchar_t * * argv=0x003b5ba8) Line 22 C++
openmp.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
openmp.exe!wmainCRTStartup() Line 403 C
kernel32.dll!7c817077()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

    我们看可以看到函数堆栈和平时看到的一般函数调用确实不一样,但这确实也说明不了什么,不过没有关系,我们可以做一个简单的测试,

#include "stdafx.h"
#include <windows.h>
#include <omp.h>

#define NUMBER 1000000000

int process(int start, int end)
{
int total;

total = 0;
while(start < end){
total += start %2;
start ++;
}

return total;
}

void test1()
{
int i;
int time;
struct {
int start;
int end;
}value[] = {
{0 , NUMBER >> 1},
{NUMBER >> 1, NUMBER}
};
int total[2] = {0};
int result;

time = GetTickCount();

#pragma omp parallel for
for(i = 0; i < 2; i ++)
{
total[i] = process(value[i].start, value[i].end);
}

result = total[0] + total[1];
printf("%d\n", GetTickCount() - time);
}

void test2()
{
int i;
int value;
int total;

total = 0;
value = GetTickCount();

for(i = 0; i < NUMBER; i++)
{
total += i %2;
}
printf("%d\n", GetTickCount()-value);
}


int _tmain(int argc, _TCHAR* argv[])
{
test1();
test2();
return 0;
}


    test1和test2完成的功能都是一样的,但是明显test1要比test2花费的时间要少很多,这明显就是多核编程的好处。所以要想实现多核编程最大程度上的并行运算,就必须把运


算拆分成n个子运算,并且尽量减少使用锁。

总结:
    (1) 这篇文章只是介绍性的博客,详细内容可以参考​​周伟明​​先生的博客;

    (2) 关于多核编程更具体的细节和方法,可以参考《​​多核计算与程序设计​​》这本书;

    (3) 编写多核编程需要的条件很简单,cpu支持多核、打开openmp开关、添加omp头文件,剩下的就是多多练习了;

    (4) 并行运算的时候少使用锁,否则效率会大打折扣。


标签:多线程,int,之多核,编程,bytes,value,多核,total
From: https://blog.51cto.com/feixiaoxing/5881015

相关文章

  • python编程(orm原理和实践)
    就给出自己对orm的理解。之前廖雪峰给出的code,大家可以通过​​地址​​下载的到。1、orm的使用方法    一般我们使用orm都是这么写代码的,classUser(Model):id=I......
  • python编程(gevent入门)
        大家都知道python脚本执行的时候不是很快,特别是python下面的多线程机制,长久以来一直被大家所诟病。所以,很多同学都在思考python下面有没有什么方法可以让python执行......
  • python编程(巧用装饰器)
        以前没有用过装饰器,也不知道它有什么用。直到最近写了一个log函数,在直到原来python的装饰器可以这么方便。1、原来debug消息的写法    假设有一个process函数,......
  • python编程(类变量和实例变量)
        关于类变量和实例变量,一直不是很清楚。所以,想做几个实验,彻底解决这个问题。为此,我们设计了三个实验。1、直接引用类变量importosimportsysclassA():data=1......
  • python编程(python和c相互调用)
      通常为了扩展python的功能,我们需要将c库移植到python上面。python和c调用一般分成两种情况,一种是python调用c,这种情况最为普遍,也比较简单。另外一种就是c调用python,这......
  • 搜索引擎的那些事(多线程web遍历)
       上面一篇博客当中,我们可以利用单一的线程完成网页的下载。今天,我们打算在此基础上完成多线程的访问和加载操作。使用多线程,倒不是因为这项技术有多牛,主要是因为我们......
  • 21.1 动态TLS--《Windows核心编程》
    应用程序通过调用一组4个函数来使用动态TLS,这些函数实际上最经常为DLL所使用。通常情况下,如果DLL使用TLS,那么当它用DLL_PROCESS_ATTACH标志调用它的DllMain函数时......
  • 21.2 静态TLS--《Windows核心编程》
    部分笔记来自于:https://blog.csdn.net/Steven_programe_life/article/details/103358251?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baiduland......
  • socket通信编程C++实现
    socket提供了套接字,以方便我们想读取文件一样进行网络进程间的数据通信。在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文......
  • 20.3 DLL入口函数--《Windows核心编程》
    如果在执行一些与进程或者线程有关的初始化或者销毁工作的时候,需要DllMain。如果只需要创建一个包含资源的DLL,不需要这个函数。B00LWINAPIDllMain(HINSTANCEhinstDll,......