▶ 第五章,几个优化

● 代码

 #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. backref 用法

    源码 def backref(name, **kwargs): """Create a back reference with explicit keyword argu ...

  2. what are you 弄啥嘞!!!!!!!!!!!!!!!!泛型

    1.为什么需要泛型 泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇将立足于代码介绍.总结了关于泛型的知识.希望能给你带来一些帮助. 先看下面的代码: List list = ...

  3. java——————基础总结2

    一 程序中常见的错误: 1,语法错误 2, 逻辑错误 3,运行时错误 二 定义class类的时候,如果前面加个public 那么class的类名必须要和文件名一致,否则就会 出现编译错误 三 编译源文 ...

  4. django使用ckeditor上传图片

    1.在模型类中设置字段为富文本类型,这里需要注意引入的是RichTextUploadingField,以允许上传图片,需要和RichTextField区分开 from ckeditor_uploade ...

  5. dispatherServlet拦截所有请求,但是不拦截JSP和其他配置的servelt

    不是顺序问题,是就不拦截Servlet 不是load-on-startup启动先后顺序问题,是就是不拦截Servlet. SpringMVC默认用的是第二个 //<url-pattern> ...

  6. servlet_3

    ServletContext 介绍 提供的功能 servlet中获取servletcontext实例 servletcontext接口的方法 package com.fgy; import java. ...

  7. Java String类和StringBuffer类的区别

    1.String与StringBuffer的区别简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象.St ...

  8. Hbase各版本环境要求

    1.HBase各版本JDK支持情况           HBase Version JDK 7 JDK 8 JDK 9 JDK 10 2.0 Not Supported yes Not Support ...

  9. Linux基础入门-目录结构及文件基本操作

    一.Linux的目录结构: Windows是以存储介质为主的,主要以盘符及分区来实现文件的管理,然后之下才是目录.但Linux的磁盘从逻辑上来说是挂载在目录上的,每个目录不仅能使用本地磁盘分区的文件系 ...

  10. vue 将毫秒转为日期

    12345656546 | parseTime('{y}-{m}-{d} {h}:{i}')