转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/4988264.html

参考网址:

关于mt19937:http://www.cnblogs.com/egmkang/archive/2012/09/06/2673253.html

代码如下:

 #include "stdafx.h"
#include <iostream>
#include <random> // mt19937的头文件
#include <ppl.h> // parfor的头文件
#include <windows.h> // QueryPerformanceFrequency等函数的头文件 using namespace concurrency; // parfor使用
using namespace std; // 分配内存
void AllocMatrix(double** m, size_t n)
{
*m = new double[n*n];
memset(*m, , sizeof(double)*n*n);
} // 初始化矩阵内容
template <class Gen>
void IniMatrix(double* m, size_t n, Gen& gen)
{
for (size_t i = ; i < n; ++i)
{
for (size_t j = ; j < n; ++j)
{
m[i*n + j] = static_cast<double>(gen());
}
}
} // 释放内存
void FreeMatrix(double** m)
{
if (nullptr != *m)
{
delete[](*m);
(*m) = nullptr;
}
} // 矩阵相乘,使用for
void matrixMultiplyFor(double* res, const double* m1, const double* m2, size_t n)
{
for (size_t i = ; i < n; i++)
{
for (size_t j = i; j < n; j++)
{
double temp = ;
for (size_t k = ; k < n; k++)
{
temp += m1[i * n + k] * m2[k * n + j];
}
res[i*n + j] = temp;
}
}
} // 矩阵相乘,外层使用parfor
void matrixMultiplyParForOuter(double* res, const double* m1, const double* m2, size_t n)
{
parallel_for(size_t(), n, [&](size_t i)
{
for (size_t j = i; j < n; j++)
{
double temp = ;
for (size_t k = ; k < n; k++)
{
temp += m1[i * n + k] * m2[k * n + j];
}
res[i*n + j] = temp;
}
});
} // 矩阵相乘,内层使用parfor
void matrixMultiplyParForInner(double* res, const double* m1, const double* m2, size_t n)
{
for (size_t i = ; i < n; i++)
{
parallel_for(size_t(i), n, [&](size_t j)
{
double temp = ;
for (size_t k = ; k < n; k++)
{
temp += m1[i * n + k] * m2[k * n + j];
}
res[i*n + j] = temp;
});
}
} // 测试矩阵相乘,使用for的时间
double testmatrixMultiplyFor(double* res, const double* m1, const double* m2, size_t n)
{
LARGE_INTEGER nFreq, nBeginTime, nEndTime;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime); matrixMultiplyFor(res, m1, m2, n); QueryPerformanceCounter(&nEndTime);
return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
} // 测试矩阵相乘,外层使用parfor的时间
double testmatrixMultiplyParForOuter(double* res, const double* m1, const double* m2, size_t n)
{
LARGE_INTEGER nFreq, nBeginTime, nEndTime;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime); matrixMultiplyParForOuter(res, m1, m2, n); QueryPerformanceCounter(&nEndTime);
return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
} // 测试矩阵相乘,内层使用parfor的时间
double testmatrixMultiplyParForInner(double* res, const double* m1, const double* m2, size_t n)
{
LARGE_INTEGER nFreq, nBeginTime, nEndTime;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime); matrixMultiplyParForInner(res, m1, m2, n); QueryPerformanceCounter(&nEndTime);
return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
} // 主函数
int _tmain(int argc, _TCHAR* argv[])
{
const size_t n = ;
double* dM1 = NULL;
double* dM2 = NULL;
double* dRes1 = NULL;
double* dRes2 = NULL;
double* dRes3 = NULL; random_device rd;
mt19937 gen(rd()); AllocMatrix(&dM1, n);
AllocMatrix(&dM2, n);
IniMatrix(dM1, n, gen);
IniMatrix(dM2, n, gen); AllocMatrix(&dRes1, n);
AllocMatrix(&dRes2, n);
AllocMatrix(&dRes3, n); double dTimeFor = testmatrixMultiplyFor(dRes1, dM1, dM2, n);
double dTimeParForOuter = testmatrixMultiplyParForOuter(dRes2, dM1, dM2, n);
double dTimeParForInner = testmatrixMultiplyParForInner(dRes3, dM1, dM2, n); printf("time(ms)\nfor: %f \nparforOunter: %f \nparforInner: %f\n", dTimeFor, dTimeParForOuter, dTimeParForInner); FreeMatrix(&dM1);
FreeMatrix(&dM2);
FreeMatrix(&dRes1);
FreeMatrix(&dRes2);
FreeMatrix(&dRes3); return ;
}

debug

time(ms)

for: 7761.769099

parforOunter: 3416.670736

parforInner: 3423.701265

release

time(ms)

for: 3884.167485

parforOunter: 1062.581817

parforInner: 1083.642302

说明:此处测试outerinner是因为,matlab里面,使用outer形式的并行计算,使用parfor后,如果循环比对类似这种三角形式,最终有些核先跑完结果,有些核后跑完结果,导致出现,一个核累死累活的跑程序,另外N-1个核围观的状态,使最终的计算时间变长(不过在matlab中未测试outerinner使用parfor的时间对比)。

但是,在C++里面,不知道是否优化的原因,outer使用parforinner使用parfor要快。此处测试了n=2048,结果也是outerinner的形式要快。

(原)测试intel的并行计算pafor的更多相关文章

  1. (原)测试 Java中Synchronized锁定对象的用法

    今天再android_serial_port中看到了关键字 synchronized;因为刚好在学java和android,所以就查了一下它的用法: 于是把代码中的一小段代码拿了出来,做了一下修改,测 ...

  2. 【原】C++11并行计算 — 数组求和

    本文转载请注明出处 -- polobymulberry-博客园 0x00 - 前言 最近想优化ORB-SLAM2,准备使用并行计算来提高其中ORB特征提取的速度.之前对并行计算方面一窍不通.借此机会, ...

  3. Intel MKL函数,如何得到相同的计算结果?【转】

    在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...

  4. 手机发烫是为何—— App 电量测试定位方法

    为什么要做电量测试 随着移动互联网的快速发展,手机的实用性.娱乐性越来越强.日常使用中发现,安装了应用后,即使不怎么使用,电量也会消耗很快.但如果恢复出场设置充满电后,手机可以待机很长时间.真相只有一 ...

  5. MongoDB 副本集丢失数据的测试

    在MongoDB副本集的测试中发现了一个丢数据的案例. 1. 概要描述 测试场景为:一主一从一验证 测试案例 step1 :关闭从副本: step 2 :向主副本中插入那条数据: step 3 :关闭 ...

  6. (原创)发布一个c++11开发的轻量级的并行Task库TaskCpp

    TaskCpp简介 TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍.既然已经有了这 ...

  7. 【AR实验室】mulberryAR:并行提取ORB特征

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 在[AR实验室]mulberryAR : ORBSLAM2+VVSION末尾提及了iPhone5s真机测试结果,其中 ...

  8. tfs 分支

    集团-IT部张强 11:15:211.主干时刻处于稳定状态,随时可以发布.设专门人员对主干代码进行管理,普通开发人员只读. 2.为开发任务建立开发分支.常规的可以以小组为单位建立分支,较大的任务可以建 ...

  9. 单元测试_JUnit4的应用与实践

    本文实例为:JUnit4+Eclipse+CVS的实践 目录 1.测试环境搭建 1.1 JDK安装部署 1.2 Eclipse安装部署 1.3 Eclipse添加JUnit4 1.4 CVS项目文件引 ...

随机推荐

  1. Java 中关键字transient引出序列化与反序列化

    一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...

  2. jquery validate form 异步提交

    jQuery取得select选中的值 jQuery("#select1  option:selected").text(); 相信很多人都用过jquery validate插件,非 ...

  3. [转]jQuery插件开发精品教程,让你的jQuery提升一个台阶

    原文链接:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其 ...

  4. win32下用VC扩展PHP全过程

    闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不 多说了,进入正题: 一.已经在机器上安装PHP环境的就略过,否则先 ...

  5. Turbo Sort Add problem to Todo list Problem code: TSORT

    def heap_sort(ary): n = len(ary) first = int(n / 2 - 1) for start in range(first, -1, -1): # 3~0 rev ...

  6. AutoCompleteTextView 与sqlite绑定实现记住用户输入的内容并自动提示

    把用户输入的内容保存到数据库表中,然后用户输入时,进行模糊查询并把查询结果附到AutoCompleteTextView中. 1:activity_main.xml <LinearLayout x ...

  7. bwlabel函数的c++实现

    实验中需要用到区域联通的算法,就是类似于matlab中bwlabel的函数.网上找了找c++源码未果,bwlabel-python版用python描述了matlab中的实现方法,但是最后对标签的处理部 ...

  8. July 【补题】

    A(zoj 3596) bfs,记忆搜都可以, 按余数来记录状态. B(zoj 3599) 博弈,跳过 C(zoj 3592) 简单dp,题意不好懂 D(zoj 3602) 子树哈希, 对根的左右儿子 ...

  9. REST API初识及设计

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  10. AsyncTask实现下载图片

    实现效果: /*采用异步任务  AsyncTask<String,Integer, byte[]>  * 参数一代表 执行异步任务时传递的参数的类型  * 参数二 如果不采用进度,则填Vo ...