(原)测试intel的并行计算pafor
转载请注明出处:
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
说明:此处测试outer和inner是因为,matlab里面,使用outer形式的并行计算,使用parfor后,如果循环比对类似这种三角形式,最终有些核先跑完结果,有些核后跑完结果,导致出现,一个核累死累活的跑程序,另外N-1个核围观的状态,使最终的计算时间变长(不过在matlab中未测试outer和inner使用parfor的时间对比)。
但是,在C++里面,不知道是否优化的原因,outer使用parfor比inner使用parfor要快。此处测试了n=2048,结果也是outer比inner的形式要快。
(原)测试intel的并行计算pafor的更多相关文章
- (原)测试 Java中Synchronized锁定对象的用法
今天再android_serial_port中看到了关键字 synchronized;因为刚好在学java和android,所以就查了一下它的用法: 于是把代码中的一小段代码拿了出来,做了一下修改,测 ...
- 【原】C++11并行计算 — 数组求和
本文转载请注明出处 -- polobymulberry-博客园 0x00 - 前言 最近想优化ORB-SLAM2,准备使用并行计算来提高其中ORB特征提取的速度.之前对并行计算方面一窍不通.借此机会, ...
- Intel MKL函数,如何得到相同的计算结果?【转】
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...
- 手机发烫是为何—— App 电量测试定位方法
为什么要做电量测试 随着移动互联网的快速发展,手机的实用性.娱乐性越来越强.日常使用中发现,安装了应用后,即使不怎么使用,电量也会消耗很快.但如果恢复出场设置充满电后,手机可以待机很长时间.真相只有一 ...
- MongoDB 副本集丢失数据的测试
在MongoDB副本集的测试中发现了一个丢数据的案例. 1. 概要描述 测试场景为:一主一从一验证 测试案例 step1 :关闭从副本: step 2 :向主副本中插入那条数据: step 3 :关闭 ...
- (原创)发布一个c++11开发的轻量级的并行Task库TaskCpp
TaskCpp简介 TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍.既然已经有了这 ...
- 【AR实验室】mulberryAR:并行提取ORB特征
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 在[AR实验室]mulberryAR : ORBSLAM2+VVSION末尾提及了iPhone5s真机测试结果,其中 ...
- tfs 分支
集团-IT部张强 11:15:211.主干时刻处于稳定状态,随时可以发布.设专门人员对主干代码进行管理,普通开发人员只读. 2.为开发任务建立开发分支.常规的可以以小组为单位建立分支,较大的任务可以建 ...
- 单元测试_JUnit4的应用与实践
本文实例为:JUnit4+Eclipse+CVS的实践 目录 1.测试环境搭建 1.1 JDK安装部署 1.2 Eclipse安装部署 1.3 Eclipse添加JUnit4 1.4 CVS项目文件引 ...
随机推荐
- mac删除顽固图标
cd /Users/shelley/Library/Application\ Support/Dock cp 10CCA448-0975-41DE-B47A-8E89FD634227.db 10 ...
- 动态编译添加php模块
注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要 ...
- C语言--位运算符
一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010, 7用二进制表示为0111.对两个数值进行&a ...
- .net mvc结合微软提供的FormsAuthenticationTicket登陆
一.Web.config <system.web> <compilation debug="true" targetFramework="4.5&quo ...
- C语言日期时间标准库
用思维导图整理: 代码: #include <stdio.h> #include <time.h> #include <string.h> int main() { ...
- mysql group_concat函数是有长度限制的
在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...
- VirtualBox虚拟机无法选择桥接方式
VirtualBox 装好之后默认的网络是NAT模式,但这种模式中虚拟机配置的IP和主机的不再同一网段内,无法获得和主机一样的局域网地位,更不可能从主机用远程桌面携带硬盘的方式远程控制.而最简便的方法 ...
- 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 ...
- smarty模板执行原理
为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开 ...
- 解决kibana 4 关于响应时间的问题
"message" => " 10.252.142.174 [12/Sep/2016:16:43:47 +0800] \"GET /resources/j ...