zoukankan      html  css  js  c++  java
  • OpenMP性能优化方案

    #include <iostream>
    #include <windows.h>
    using namespace std;

    struct Count
    {
        long count1;
        char space[64];  // 此处增加64字节的“无用”空间,目的就是使得count1和count2位于不同的Cache行,从而避免Cache行同步引起的“乒乓效应”,可以尝试去掉这64字节的“无用”空间,将会得到令人诧异的运行结果,要探明深层原因,可以搜索一下“乒乓效应 CPU cache”

        long count2;
    };
    DWORD WINAPI Calculate1(void *p)
    {
        double x = 0,y = 0;
        long* c1 = (long*)p;
        for(; x <= 0.5;x += 0.0001) 
            for(y = 0;y <= 1;y += 0.0001) 
            { 
                if (x*x + y*y <= 1) (*c1)++; 
            } 
        return 0;
    }
    DWORD WINAPI Calculate2(void *p)
    {
        double i = 0,j = 0;//16
        long* c2 = (long*)p;
        for(i=0.5001;i <=1;i+=0.0001) 
            for(j=0;j <=1;j+=0.0001) 
            { 
                if(i*i+j*j <=1) (*c2)++; 
            } 
        return 0;
    }

    int main()
    {
        DWORD pThreadID;
        Count cnt;

        DWORD startTime = 0,endTime = 0;
        startTime= GetTickCount(); 
        Calculate1(&cnt.count1);
        Calculate2(&cnt.count2);
        cout << "Serial calculate cost " << GetTickCount() - startTime << "ms." << endl;

        cnt.count1 = 0;
        cnt.count2 = 0;
        startTime= GetTickCount();

        HANDLE hThread1 = CreateThread (NULL,
                                        0,
                                        Calculate1,
                                        &cnt.count1,
                                        0,
                                        &pThreadID);

        HANDLE hThread2 = CreateThread (NULL,
                                        0,
                                        Calculate2,
                                        &cnt.count2,
                                        0,
                                        &pThreadID);


        WaitForSingleObject(hThread1, INFINITE); 
        WaitForSingleObject(hThread2, INFINITE); 
        endTime=GetTickCount();

        cout << "Parallel calculate cost " << endTime-startTime << "ms." << endl; 
    }

  • 相关阅读:
    nose测试中修改nose_html_reporting插件,使生成的html报告加入显示截图功能
    python selenium中等待元素出现及等待元素消失操作
    在python pydev中使用todo标注任务
    云存储命令行工具---libs3
    关于qt creator各种假死的问题
    小端存储转大端存储 & 大端存储转小端存储
    C++判断计算式是大端存储模式,还是小端存储模式
    请教网友:#pragma pack(push) #pragma pack(pop)无效
    sizeof 计算 struct 占字节数的方法总结
    const 变量在多个文件共享,如何验证两种不同的方式下,编译器是否会在多个文件下建立多个副本
  • 原文地址:https://www.cnblogs.com/jast/p/4516471.html
Copyright © 2011-2022 走看看