▶ 第五章,几个优化

● 代码

 #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的更多相关文章

  1. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 1

    ▶ 第三章,逐步优化了一个二维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...

  2. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 3

    ▶ 第二章,几个简单的程序 ● 代码,单线程 #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  3. Xeon Phi 《协处理器高性能编程指南》随书代码整理 part 2

    ▶ 第四章,逐步优化了一个三维卷积计算的过程 ● 基准代码 #include <stdio.h> #include <stdlib.h> #include <string ...

  4. Xeon Phi 编程备忘

    ▶ 闲鱼的 Xeon Phi 3120A 配办公室的新 Xeon 服务器,记录一下环境安装过程. ● 原本尝试搭 Ubuntu 服务器,参考[https://software.intel.com/en ...

  5. Python猫荐书系列之五:Python高性能编程

    稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...

  6. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  7. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  8. 物联网操作系统HelloX应用编程指南

    HelloX操作系统应用编程指南 HelloX应用开发概述 可以通过三种方式,在HelloX操作系统基础上开发应用: 1.        以内部命令方式实现应用,直接编译链接到HelloX的内核she ...

  9. JDK 高性能编程之容器

    高性能编程在对不同场景下对于容器的选择有着非常苛刻的条件,这里记录下前人总结的经验,并对源码进行调试 JDK高性能编程之容器 读书笔记内容部分来源书籍深入理解JVM.互联网等 先放一个类图util,点 ...

随机推荐

  1. 枚举转map

    import java.util.HashMap; import java.util.Map; public enum PayType { ALIPAY("支付宝扫码", 15), ...

  2. Mybatis根据List批量查询List结果

    https://blog.csdn.net/qq_36688928/article/details/82783392

  3. tensorflow 代码阅读

    具体实现: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/framework 『深度长文』Tensorflo ...

  4. JWT学习小结

    JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性.我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持. 1,相较于常见的 ...

  5. Java技术学习之影响MySQL性能的配置参数

    本文将介绍MySQL参数的五大类设置,平时我们一般都很少碰它们,在进行MySQL性能调优和故障诊断时这些参数还是非常有用的. (一)连接连接通常来自Web服务器,下面列出了一些与连接有关的参数,以及该 ...

  6. 2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告

    2018-2019-2 20175202实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...

  7. 我发起了一个 ILBC 的 子项目 EScript

    ILBC  见 <ILBC 规范>  https://www.cnblogs.com/KSongKing/p/10354824.html 今天装了个 VsCode , 听说 VsCode ...

  8. JIT(Just in time,即时编译,边运行边编译)、AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

    JIT(Just in time,即时编译,边运行边编译).AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

  9. imp 导入以及换用户报错

    数据库导入操作:SQL> create user user identified by passwd; SQL> create tablespace user datafile '/dat ...

  10. 管理mysql数据的两条sql tips

    当从B表数据更新到A表时: update A inner join B on A.aid=B.aid set A.user_name=B.username,A.phone=B.telwhere A.a ...