转载请注明出处:

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

参考网址:

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

代码如下:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <random> // mt19937的头文件
  4. #include <ppl.h> // parfor的头文件
  5. #include <windows.h> // QueryPerformanceFrequency等函数的头文件
  6.  
  7. using namespace concurrency; // parfor使用
  8. using namespace std;
  9.  
  10. // 分配内存
  11. void AllocMatrix(double** m, size_t n)
  12. {
  13. *m = new double[n*n];
  14. memset(*m, , sizeof(double)*n*n);
  15. }
  16.  
  17. // 初始化矩阵内容
  18. template <class Gen>
  19. void IniMatrix(double* m, size_t n, Gen& gen)
  20. {
  21. for (size_t i = ; i < n; ++i)
  22. {
  23. for (size_t j = ; j < n; ++j)
  24. {
  25. m[i*n + j] = static_cast<double>(gen());
  26. }
  27. }
  28. }
  29.  
  30. // 释放内存
  31. void FreeMatrix(double** m)
  32. {
  33. if (nullptr != *m)
  34. {
  35. delete[](*m);
  36. (*m) = nullptr;
  37. }
  38. }
  39.  
  40. // 矩阵相乘,使用for
  41. void matrixMultiplyFor(double* res, const double* m1, const double* m2, size_t n)
  42. {
  43. for (size_t i = ; i < n; i++)
  44. {
  45. for (size_t j = i; j < n; j++)
  46. {
  47. double temp = ;
  48. for (size_t k = ; k < n; k++)
  49. {
  50. temp += m1[i * n + k] * m2[k * n + j];
  51. }
  52. res[i*n + j] = temp;
  53. }
  54. }
  55. }
  56.  
  57. // 矩阵相乘,外层使用parfor
  58. void matrixMultiplyParForOuter(double* res, const double* m1, const double* m2, size_t n)
  59. {
  60. parallel_for(size_t(), n, [&](size_t i)
  61. {
  62. for (size_t j = i; j < n; j++)
  63. {
  64. double temp = ;
  65. for (size_t k = ; k < n; k++)
  66. {
  67. temp += m1[i * n + k] * m2[k * n + j];
  68. }
  69. res[i*n + j] = temp;
  70. }
  71. });
  72. }
  73.  
  74. // 矩阵相乘,内层使用parfor
  75. void matrixMultiplyParForInner(double* res, const double* m1, const double* m2, size_t n)
  76. {
  77. for (size_t i = ; i < n; i++)
  78. {
  79. parallel_for(size_t(i), n, [&](size_t j)
  80. {
  81. double temp = ;
  82. for (size_t k = ; k < n; k++)
  83. {
  84. temp += m1[i * n + k] * m2[k * n + j];
  85. }
  86. res[i*n + j] = temp;
  87. });
  88. }
  89. }
  90.  
  91. // 测试矩阵相乘,使用for的时间
  92. double testmatrixMultiplyFor(double* res, const double* m1, const double* m2, size_t n)
  93. {
  94. LARGE_INTEGER nFreq, nBeginTime, nEndTime;
  95. QueryPerformanceFrequency(&nFreq);
  96. QueryPerformanceCounter(&nBeginTime);
  97.  
  98. matrixMultiplyFor(res, m1, m2, n);
  99.  
  100. QueryPerformanceCounter(&nEndTime);
  101. return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
  102. }
  103.  
  104. // 测试矩阵相乘,外层使用parfor的时间
  105. double testmatrixMultiplyParForOuter(double* res, const double* m1, const double* m2, size_t n)
  106. {
  107. LARGE_INTEGER nFreq, nBeginTime, nEndTime;
  108. QueryPerformanceFrequency(&nFreq);
  109. QueryPerformanceCounter(&nBeginTime);
  110.  
  111. matrixMultiplyParForOuter(res, m1, m2, n);
  112.  
  113. QueryPerformanceCounter(&nEndTime);
  114. return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
  115. }
  116.  
  117. // 测试矩阵相乘,内层使用parfor的时间
  118. double testmatrixMultiplyParForInner(double* res, const double* m1, const double* m2, size_t n)
  119. {
  120. LARGE_INTEGER nFreq, nBeginTime, nEndTime;
  121. QueryPerformanceFrequency(&nFreq);
  122. QueryPerformanceCounter(&nBeginTime);
  123.  
  124. matrixMultiplyParForInner(res, m1, m2, n);
  125.  
  126. QueryPerformanceCounter(&nEndTime);
  127. return (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * / (double)nFreq.QuadPart;
  128. }
  129.  
  130. // 主函数
  131. int _tmain(int argc, _TCHAR* argv[])
  132. {
  133. const size_t n = ;
  134. double* dM1 = NULL;
  135. double* dM2 = NULL;
  136. double* dRes1 = NULL;
  137. double* dRes2 = NULL;
  138. double* dRes3 = NULL;
  139.  
  140. random_device rd;
  141. mt19937 gen(rd());
  142.  
  143. AllocMatrix(&dM1, n);
  144. AllocMatrix(&dM2, n);
  145. IniMatrix(dM1, n, gen);
  146. IniMatrix(dM2, n, gen);
  147.  
  148. AllocMatrix(&dRes1, n);
  149. AllocMatrix(&dRes2, n);
  150. AllocMatrix(&dRes3, n);
  151.  
  152. double dTimeFor = testmatrixMultiplyFor(dRes1, dM1, dM2, n);
  153. double dTimeParForOuter = testmatrixMultiplyParForOuter(dRes2, dM1, dM2, n);
  154. double dTimeParForInner = testmatrixMultiplyParForInner(dRes3, dM1, dM2, n);
  155.  
  156. printf("time(ms)\nfor: %f \nparforOunter: %f \nparforInner: %f\n", dTimeFor, dTimeParForOuter, dTimeParForInner);
  157.  
  158. FreeMatrix(&dM1);
  159. FreeMatrix(&dM2);
  160. FreeMatrix(&dRes1);
  161. FreeMatrix(&dRes2);
  162. FreeMatrix(&dRes3);
  163.  
  164. return ;
  165. }

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. mac删除顽固图标

    cd  /Users/shelley/Library/Application\ Support/Dock cp  10CCA448-0975-41DE-B47A-8E89FD634227.db  10 ...

  2. 动态编译添加php模块

    注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要 ...

  3. C语言--位运算符

    一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010,  7用二进制表示为0111.对两个数值进行&a ...

  4. .net mvc结合微软提供的FormsAuthenticationTicket登陆

    一.Web.config <system.web> <compilation debug="true" targetFramework="4.5&quo ...

  5. C语言日期时间标准库

    用思维导图整理: 代码: #include <stdio.h> #include <time.h> #include <string.h> int main() { ...

  6. mysql group_concat函数是有长度限制的

    在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...

  7. VirtualBox虚拟机无法选择桥接方式

    VirtualBox 装好之后默认的网络是NAT模式,但这种模式中虚拟机配置的IP和主机的不再同一网段内,无法获得和主机一样的局域网地位,更不可能从主机用远程桌面携带硬盘的方式远程控制.而最简便的方法 ...

  8. LeetCode_Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  9. smarty模板执行原理

    为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开 ...

  10. 解决kibana 4 关于响应时间的问题

    "message" => " 10.252.142.174 [12/Sep/2016:16:43:47 +0800] \"GET /resources/j ...