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,点 ...
随机推荐
- PAT1001A+B Format
链接:https://www.patest.cn/contests/pat-a-practise/1001 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 ...
- curl请求
<?php $cookie_file = tempnam('./temp','cookie'); //创建cookie文件保存的位置/** * [curl description] * @pa ...
- 终于懂得Perl句柄是什么意思了
一直以来就对Perl语言特别感兴趣,去年特别膨胀的 直接买了一本大骆驼书,想好好看看Perl编程,结果看到I/O,句柄的时候就觉得云山雾罩,不知道是在说啥了, 最近,京东打折,终于有机会又买了本小骆驼 ...
- sql server 与 sql server compact 互相数据导入
从SQL Server 导出数据到 Sql Compact 使用 Sql Server Compact Tool box 从SQL Server Comapct 导出数据到 Sql Server 使 ...
- 现在企业开发时,Java所用到的主流框架有哪些?
虽然Java一直被唱衰,但是直到现在Java软件开发也坚持霸主地位不动摇.毫无疑问,Java是目前最热门的编程语言之一.随着Java面向对象语言的流行以及多层架构应用的出现,使得应用程序的可复用性得到 ...
- redis五种数据类型和常用命令及适用场景
一.redis的5种数据类型: 1.基础理解: string 字符串(可以为整形.浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) h ...
- bond-team
nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name": & ...
- js for循环中定义clike事件由于闭包导致的循环变量获取不到的问题
在网上找的 记下来以备不时之需 案例; 本人有一个数组按钮 循环数组按钮 给每个按钮添加click事件 原本以为搞定但是出现了 每个按钮都是数组最后的方法 然后查找问题 发现onclike事件中的i ...
- kvm中重命名虚拟机
kvm中重命名虚拟机 1.查看虚拟机 [root@linux ~]# virsh list --all Id Name State ---------------------------------- ...
- 【C++】智能指针简单剖析
转自 http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中 ...