I'm implementing an ultra fast popcount on Intel Xeon® Phi®, as it's a performance hotspot of various bioinformatics software.
I've implemented five pieces of code,
#if defined(__MIC__)
#include <zmmintrin.h>
__attribute__((align(64))) static const uint32_t POPCOUNT_4bit[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
__attribute__((align(64))) static const uint32_t MASK_4bit[16] = {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF};
inline uint64_t vpu_popcount1(uint64_t* buf, size_t n) { …Run Code Online (Sandbox Code Playgroud) 是否可以使用基于JVM的语言(如Scala)来使用Xeon Phi?有什么例子吗?
我们一直试图使用新的GCC 5.1版本将OpenMP块卸载到Intel MIC(即Xeon Phi),但未成功.在GCC Offloading页面之后,我们将build.sh脚本放在一起,为"intelmic"和主机编译器构建"accel"目标编译器.编译似乎成功完成.
env.sh然后使用该脚本,我们尝试编译hello.c下面列出的简单程序.但是,此程序似乎只在主机上运行,而不是在目标设备上运行.
由于我们不熟悉卸载,以及编译GCC,我们可能会做错多少事情.但是,我们已经调查了已经提到的资源以及以下内容(我没有足够的代表来发布链接):
最大的问题是他们通常会参考英特尔编译器.虽然我们计划购买副本,但目前我们没有副本.此外,我们的大部分开发流程已经与GCC集成,我们更愿意保持这种方式(如果可能的话).
我们安装了最新的MPSS 3.5发行版,对Ubuntu下的工作进行了必要的修改.我们可以在我们的系统中成功地沟通和检查Xeon Phis的状态.
在我们的努力中,我们从未看到代码在麦克风仿真模式下运行的任何迹象.
谢谢!
#!/usr/bin/env bash
set -e -x
unset LIBRARY_PATH
GCC_DIST=$PWD/gcc-5.1.0
# Modify these to control where the compilers are installed
TARGET_PREFIX=$HOME/gcc
HOST_PREFIX=$HOME/gcc
TARGET_BUILD=/tmp/gcc-build-mic
HOST_BUILD=/tmp/gcc-build-host
# i dropped the emul since we are not planning to emulate!
TARGET=x86_64-intelmic-linux-gnu
# should this be a quad (i.e. pc)?? default …Run Code Online (Sandbox Code Playgroud) 英特尔编译器在循环内生成以下预取指令,以通过a_ptr指针访问数组:
400e93: 62 d1 78 08 18 4c 24 vprefetch0 [r12+0x80]
Run Code Online (Sandbox Code Playgroud)
如果我手动更改(通过十六进制编辑可执行文件)这到非临时预取:
400e93: 62 d1 78 08 18 44 24 vprefetchnta [r12+0x80]
Run Code Online (Sandbox Code Playgroud)
循环运行快了近1.5倍(!!!).但是,我更喜欢编译器为我生成非时间预取.我以为
#pragma prefetch a_ptr:_MM_HINT_NTA
Run Code Online (Sandbox Code Playgroud)
在循环之前应该做的伎俩,但它实际上没有; 它生成的指令与不完整的pragma完全相同.为什么icpc忽略这个pragma?我怎么强迫它生成非时间预取?
选择.据我所知,报告没有说任何有用的内容:
LOOP BEGIN at test-mic.cpp(56,5)
remark #15344: loop was not vectorized: vector dependence prevents vectorization
remark #15346: vector dependence: assumed ANTI dependence between b_ptr line 64 and b_ptr line 65
remark #15346: vector dependence: assumed FLOW dependence between b_ptr line 65 and b_ptr line …Run Code Online (Sandbox Code Playgroud) 说,我想清除4个zmm寄存器.
以下代码是否会提供最快的速度?
vpxorq zmm0, zmm0, zmm0
vpxorq zmm1, zmm1, zmm1
vpxorq zmm2, zmm2, zmm2
vpxorq zmm3, zmm3, zmm3
Run Code Online (Sandbox Code Playgroud)
在AVX2上,如果我想清除ymm寄存器,vpxor比vxorps更快,速度更快,因为vpxor可以在多个单元上运行.
在AVX512上,我们没有用于zmm寄存器的vpxor,只有vpxorq和vpxord.这是清除寄存器的有效方法吗?当我使用vpxorq清除zmm寄存器时,CPU是否足够智能,不会对zmm寄存器的先前值产生错误依赖?
在没有物理AVX512 CPU测试的情况下 - 也许有人在Knights Landing上测试过?是否有任何延迟发布?
我打算将一些计算卸载到Xeon Phi,但是想先测试不同的API和不同的并行编程.
是否有适用于Xeon Phi(Windows或Linux)的模拟器/模拟器?
英特尔至强披"骑士降落"处理器将是第一个支持AVX-512,但它只能支持"F"(如无SSE SSE2,或不AVX AVX2),所以浮点东西为主.
我正在编写使用内部函数通过SSE4.1指令操作字节和字(8位和16位)的软件.
我很困惑,是否会出现在AVX-512F全部/大部分SSE4.1指令EVEX编码的版本,以及这是否意味着我可以期待我的SSE代码来自动获取EVEX扩展指令和映射到所有新的寄存器.
维基百科说:
SIMD寄存器文件的宽度从256位增加到512位,共有32个寄存器ZMM0-ZMM31.如256位的YMM从AVX扩展和从流SIMD扩展128位XMM寄存器寄存器,这些寄存器可被寻址,和遗留AVX和SSE指令可以扩展到在16个附加寄存器XMM16-XMM31和YMM16-YMM31使用EVEX当操作编码形式.
这不幸的是没有澄清是否编译SSE4代码启用AVX512,会导致相同的(真棒)加速比它编译成AVX2提供(的传统指令VEX编码).
有人知道为AVX-512F编译SSE2/4代码(C内在函数)会发生什么?人们可以期待像AVX1的字节和字指令的VEX编码那样的速度颠簸吗?
我最近开始使用Xeon Phi Knights Landing(KNL)7250计算机(http://ark.intel.com/products/94035/Intel-Xeon-Phi-Processor-7250-16GB-1_40-GHz-68-core) .
它有68个核心和AVX 512.基本频率为1.4 GHz,Turbo频率为1.6 GHz.我不知道所有内核的turbo频率是多少,因为通常turbo频率只引用一个内核.
每个Knights Landing核心每个周期可以进行两次8宽双FMA操作.由于每个FMA操作是两个浮点运算,因此每个核每个周期的双浮点运算为32.
因此最大GFLOPS是32*68*1.4 = 3046.4 DP GFLOPS.
对于单核心,峰值FLOPS是32*1.6 = 51.2 DP GLOPS.
密集矩阵乘法是实际上能够接近峰值触发器的少数操作之一.英特尔MKL库提供优化的密集矩阵乘法功能.在Sandy Bridge系统中,我使用DGEMM获得了超过97%的峰值FLOPS.在哈斯威尔,几年前我检查了大约90%的峰值,所以当时用FMA获得峰值显然更加困难.然而,凭借Knights Landing和MKL,我得到的峰值不到50%.
我修改了dgemm_example.cMKL示例目录中的文件以使用2.0*1E-9*n*n*n/time(参见下文)计算GFLOPS .
我也试过了export KMP_AFFINITY=scatter,export OMP_NUM_THREADS=68但这似乎没有什么区别.但是,KMP_AFFINITY=compact速度明显较慢,因此OMP_NUM_THREADS=1默认的线程拓扑似乎是分散的,并且线程正在工作.
我见过的最好的GFLOPS约为1301 GFLOPS,约占峰值的43%.对于一个线程,我看到38 GFLOPS,约占峰值的74%.这告诉我MKL DGEMM针对AVX512进行了优化,否则会看到不到50%.另一方面,对于单个线程,我认为我应该获得90%的峰值.
KNL内存可以在三种模式下运行(缓存,平面和混合),可以通过BIOS设置(http://www.anandtech.com/show/9794/a-few-notes-on-intels-knights-登陆-mcdram-modes-from-sc15).我不知道我的(或者说我的工作)KNL系统是什么模式.这会对DGEMM产生影响吗?
我的问题是为什么DGEMM的FLOPS如此之低,我该怎么做才能改进它?也许我没有最佳配置MKL(我正在使用ICC 17.0).
source /opt/intel/mkl/bin/mklvars.sh intel64
icc -O3 -mkl dgemm_example.c
Run Code Online (Sandbox Code Playgroud)
这是代码
#define min(x,y) (((x) < (y)) ? (x) : (y))
#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"
#include …Run Code Online (Sandbox Code Playgroud)