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,点 ...
随机推荐
- asdasf
bigFile = open('big.txt',mode='r',encoding='utf-8') bigText = bigFile.read() bigFile.close() print(b ...
- Mabatis面试题
Mybatis面试题 1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="U ...
- 总结描述用户和组管理类命令的使用方法,系统用户相关信息,取出主机IP地址
1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. [root@db146 ~]# who|cut -f1 -d' ' |sort -u root 2.取出最后 ...
- What is the Annotation?
Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...
- Redis纠错
在Java使用Redis的过程中遇见了一个问题, redis.clients.jedis.exceptions.JedisConnectionException: Could not get a re ...
- Oracle的安装+PL安装+系统变量配好后重启
服务启动后的样子 第一步安装oracle服务 链接: https://pan.baidu.com/s/1sRu95Vy1arc3gfuH9nH5Wg 提取码: eaxx 复制这段内容后打开百度网盘手机 ...
- Flagr 架构
来自官方文档 https://checkr.github.io/flagr/#/flagr_overview There are three components in the flagr, Flag ...
- idea 编译 内存不足
- 火狐firebug和firepath插件安装方法(最新)
火狐浏览器最近下掉了firebug和firepath插件,用户即使下载了火狐55以下的版本,也无法查找到这两个插件. 因此,可以用以下方法来获取这两个插件. 1.下载火狐55以内版本安装包,安装时迅速 ...
- PageHelper 自动去掉排序参数问题
PageHelper.startPage( req.getCurrent() , req.getSize() ,"ordersCreateDate desc" ); 如果 上面 ...