Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 4
▶ 第五章,几个优化
● 代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h> #define S 1024*32
#define T float
#define ITER 1000
#define VLEN 16 __declspec(noinline) void scalar(T *A, T *B, T *C, T k) // 标量型
{
__assume_aligned(A, ); // 声明数组对齐到 512 bit
__assume_aligned(B, );
__assume_aligned(C, );
for (int i = ; i < S; i++)
{
T tmp = A[i] * k + B[i];
if (tmp > 0.5f)
tmp *= sin(B[i]);
C[i] = tmp;
}
} __declspec(noinline) void shortVector(T *A, T *B, T *C, T k)// 短向量型
{
__assume_aligned(A, );
__assume_aligned(B, );
__assume_aligned(C, );
for (int i = ; i < S; i+=VLEN)
{
T tmp[VLEN];
tmp[:]= A[i:VLEN] * k + B[i:VLEN]; // Cilk 的 tmp[起点:长度] 作引用
if (tmp[:] > 0.5f)
tmp[:] *= sin(B[i:VLEN]);
C[i:VLEN] = tmp[:];
}
} int main()
{
volatile __int64 start, time1, time2;
T ref_result, short_result;
const float k = 0.5; T *A, *B, *C; // 声明并定义对齐的数组或数组指针
posix_memalign((void **)&A, , sizeof(T)*S);
posix_memalign((void **)&B, , sizeof(T)*S);
posix_memalign((void **)&C, , sizeof(T)*S);
//__declspec(align(64)) T A[S], B[S], C[S]; // 等价的声明方式 A[:S] = __sec_implicit_index(); // 数组赋值为 {0, 1, 2, ...}
B[:S] = __sec_implicit_index();
C[:S] = ;
//for(int i=0;i<S;i++) // 等价的复制方法
// A[i] = B[i] = i, C[i] = 0; //for(int i=0;i<10;i++)
// printf("%f, ", A[i]);
//printf("\n");
//for(int i=0;i<10;i++)
// printf("%f, ", B[i]);
//printf("\n"); start = __rdtsc(); // 计时器,计算 CPU 的tick 数
for (int i = ; i < ITER; i++)
scalar(A, B, C, k);
time1 = __rdtsc() - start;
//for(int i=0;i<10;i++)
// printf("%f, ", C[i]);
//printf("\n");
ref_result = __sec_reduce_add(C[:S]); // 规约加,用于比较结果是否正确 start = __rdtsc();
for (int i = ; i < ITER; i++)
shortVector(A, B, C, k);
time2 = __rdtsc() - start;
//for(int i=0;i<10;i++)
// printf("%f, ", C[i]);
//printf("\n");
short_result = __sec_reduce_add(C[:S]); printf("ref:\t%f, %Id CPU tick\nshort:\t%f, %Id CPU tick\n", ref_result, time1, short_result, time2);
return ;
}
● 输出结果。O0 优化,XeonPhi 上 CPU tick,较少,尤其是 shortVector 优化效果明显,但是 O3 优化 XeonPhi 更差,甚至比自身 O0 还差
[cuan@server3145 XeonPhi]$ icc kk.c -O0
[cuan@server3145 XeonPhi]$ ./a.out
ref: -39578.562500, CPU tick
short: -39578.562500, CPU tick
[cuan@server3145 XeonPhi]$ icc -mmic kk.c -O0
[cuan@server3145 XeonPhi]$ scp a.out cuan@mic0:/home/cuan
cuan@mic0's password:
a.out % 33KB .5KB/s :
[cuan@server3145 XeonPhi]$ ssh cuan@mic0
cuan@mic0's password:
[cuan@server3145-mic0 ~]$ ./a.out
ref: -39578.562500, CPU tick
short: -39578.562500, CPU tick [cuan@server3145 XeonPhi]$ icc kk.c -O3
[cuan@server3145 XeonPhi]$ ./a.out
ref: -39578.617188, CPU tick
short: -39578.617188, CPU tick
[cuan@server3145 XeonPhi]$ icc -mmic kk.c -O3
[cuan@server3145 XeonPhi]$ scp a.out cuan@mic0:/home/cuan
cuan@mic0's password:
a.out % 90KB .2KB/s :
[cuan@server3145 XeonPhi]$ ssh cuan@mic0
cuan@mic0's password:
[cuan@server3145-mic0 ~]$ ./a.out
ref: -39578.429688, CPU tick
short: -39578.429688, CPU tick
Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 4的更多相关文章
- Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 1
▶ 第三章,逐步优化了一个二维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...
- Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 3
▶ 第二章,几个简单的程序 ● 代码,单线程 #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 2
▶ 第四章,逐步优化了一个三维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...
- Xeon Phi 编程备忘
▶ 闲鱼的 Xeon Phi 3120A 配办公室的新 Xeon 服务器,记录一下环境安装过程. ● 原本尝试搭 Ubuntu 服务器,参考[https://software.intel.com/en ...
- Python猫荐书系列之五:Python高性能编程
稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...
- 《高性能javascript》一书要点和延伸(上)
前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- 物联网操作系统HelloX应用编程指南
HelloX操作系统应用编程指南 HelloX应用开发概述 可以通过三种方式,在HelloX操作系统基础上开发应用: 1. 以内部命令方式实现应用,直接编译链接到HelloX的内核she ...
- JDK 高性能编程之容器
高性能编程在对不同场景下对于容器的选择有着非常苛刻的条件,这里记录下前人总结的经验,并对源码进行调试 JDK高性能编程之容器 读书笔记内容部分来源书籍深入理解JVM.互联网等 先放一个类图util,点 ...
随机推荐
- jquery的相关用法
选择器基本选择器1.id选择器$('#id1')找到id为id1 的标签2.class选择器$('.class1')找到class中有class1这个类的标签3.标签选择器$('tag') 找到tag ...
- 【转】Cookie/Session机制详解
Cookie/Session机制详解 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...
- Exp2 后门原理与实践 毛瀚逸 20164318
Exp2 后门原理与实践 20164318 毛瀚逸 一.实验内容 基础问题回答: 1.例举你能想到的一个后门进入到你系统中的可能方式? 答:下载奇怪的文件并运行,通过操作系统的漏洞来获取电脑的高级权限 ...
- What is the Annotation?
Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...
- 7 种 join
DROP TABLE IF EXISTS `test_student`; CREATE TABLE `test_student` ( `id` ) NOT NULL COMMENT '学号', `se ...
- Java(日期、随机数、系统工具类)
Date类 一般用于获取时间 Date date1 = new Date();//获取当前系统时间 Date date2 = new Date(10000);//获取从标准基准时间起10000毫秒的时 ...
- VMware vSphere Client 语言切换
vpxclient -locale en_US 英语 vpxclient -locale zh_CN 汉语 vpxclient -locale ja 日语 vpxclient -locale de ...
- Python map,filter,reduce函数
# -*- coding:utf-8 -*- #定义一个自己的map函数list_list = [1,2,4,8,16] def my_map(func,iterable): my_list = [] ...
- LOJ 2547 「JSOI2018」防御网络——思路+环DP
题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...
- 承接VR外包|AR外包|Unity3D外包|UE4外包(内附案例演示)
北京团队长年承接VR/AR项目外包 咨询QQ:372900288 微信:liuxiang0884