Tag: avx2

为什么英特尔Haswell XEON CPU零星地计算FFT和ART?

在最后几天,我观察到我无法解释的新工作站的行为。 对这个问题做了一些研究, INTEL Haswell架构和当前Skylake Generation中可能存在一个bug。 在撰写关于可能的错误之前,让我给你一个使用的硬件,程序代码和问题本身的概述。 工作站硬件规范 英特尔至强E5-2680 V3 2500MHz 30Mcaching12核 Supermicro SC745 BTQ -R1K28B-SQ 4 x 32GB ECC Registered DDR4-2133 Ram INTEL SSD 730系列480 GB NVIDIA Tesla C2075 NVIDIA TITAN 有问题的操作系统和程序代码 我目前正在运行Ubuntu 15.04 64位桌面版本,最新的更新和内核的东西安装。 除了使用这台机器开发CUDA内核和东西,我最近testing了一个纯C程序。 该程序正在对相当大的input数据集进行一些修改后的ART 。 所以代码执行一些FFT并花费相当多的时间来完成计算。 我目前无法发布/链接到任何源代码,因为这是正在进行的研究,无法发布。 如果你不熟悉ART ,只是简单的解释一下。 ART是一种技术,用于重build从计算机断层摄影机接收到的数据,以获取可见的图像进行诊断。 所以我们的代码版本重build了像2048x2048x512这样的大小的数据集。 到目前为止,没有什么特别的,也没有涉及火箭科学。 经过几个小时的debugging和修复错误,代码在参考结果上进行了testing,我们可以确认代码的工作原理。 代码使用的唯一的库是标准的math.h 没有特殊的编译参数,没有额外的库的东西,可能会带来额外的问题 。 观察问题 该代码使用一种技术来实现ART,以最小化重构数据所需的投影。 那么我们假设我们可以重build一个包含25个投影的数据片。 代码在12个内核上以完全相同的input数据启动。 请注意,该实现不是基于multithreading,目前启动了12个程序实例。 我知道这不是最好的办法,涉及适当的线程pipe理是非常build议,这已经在改善列表:) […]

AVX2什么是基于掩码打包左边最有效的方法?

如果你有一个input数组和一个输出数组,但你只想写出那些通过一定条件的元素,那么在AVX2中这样做最有效的方法是什么? 我在SSE看到它是这样做的:(从: https : //deplinenoise.files.wordpress.com/2015/03/gdc2015_afredriksson_simd.pdf ) __m128i LeftPack_SSSE3(__m128 mask, __m128 val) { // Move 4 sign bits of mask to 4-bit integer value. int mask = _mm_movemask_ps(mask); // Select shuffle control data __m128i shuf_ctrl = _mm_load_si128(&shufmasks[mask]); // Permute to move valid values to front of SIMD register __m128i packed = _mm_shuffle_epi8(_mm_castps_si128(val), shuf_ctrl); return packed; } […]