当前位置:软件学习 > 其它软件 >>

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

 

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

 

    多核编程并不是最近才兴起的新鲜事物。早在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); 

    }     

#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] 

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 22C++

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; 

#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 ++;

       }

&nb

补充:软件开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,