草庐IT

SIMD_WIDTH

全部标签

c++ - 使用 openmp + SIMD 没有加速

我是Openmp的新手,现在尝试使用Openmp+SIMD内在函数来加速我的程序,但结果远非预期。为了在不丢失太多基本信息的情况下简化案例,我写了一个更简单的玩具示例:#include#include#include#include#include#include"immintrin.h"//forSIMDintrinsicsintmain(){int64_tsize=160000000;std::vectorsrc(size);//generatingrandomsrcdatafor(inti=0;idst(size);//getpointersforvectorloadandsto

C++ 集中化 SIMD 使用

我有一个图书馆和许多依赖于该图书馆的项目。我想使用SIMD扩展优化库中的某些过程。然而,保持便携对我来说很重要,所以对用户来说它应该是非常抽象的。我在一开始就说过我不想使用其他一些可以解决问题的很棒的库。我实际上想了解我想要的东西是否可能以及在多大程度上是可能的。我的第一个想法是拥有一个“vector”包装类,SIMD的使用对用户是透明的,并且可以使用“标量”vector类以防目标机器上没有可用的SIMD扩展。我想到了一个天真的想法,即使用预处理器根据编译库的目标从众多vector类中选择一个。因此,一个标量vector类,一个带有SSE的类(基本上是这样的:http://fastcp

c++ - 使用 SIMD 将 10 位值打包成字节流

这个问题在这里已经有了答案:Keeponlythe10usefulbitsin16-bitwords(2个答案)关闭去年。我正在尝试使用SIMD指令将10位像素打包成连续的字节流。下面的代码“原则上”执行此操作,但SIMD版本比标量版本慢。问题似乎是我找不到可以有效加载寄存器的良好收集/分散操作。有什么改进建议吗?//SIMD_test.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include"Windows.h"#include#include#include//referencenon

c++ - 向右移动4个整数不同的值SIMD

SSE没有提供将打包整数移位可变数量的方法(我可以使用任何AVX及更早版本的指令)。您只能进行统一轮类。我试图为vector中的每个整数实现的结果是这样的。i[0]=i[0]&0b111111;i[1]=(i[1]>>6)&0b111111;i[2]=(i[2]>>12)&0b111111;i[3]=(i[3]>>18)&0b111111;本质上是尝试在每个整数中隔离6位不同的组。那么最佳的解决方案是什么?我想到的事情:您可以模拟可变的右移,可变的左移和统一的右移。我考虑过将打包整数分别乘以不同的量(因此模拟左移)。然后,使用该结果,您可以执行统一的右移操作以获得答案。我将用于乘法的特

c# - 为什么只有 AVX 的处理器在许多 SIMD 算法方面优于 AVX2 处理器?

我一直在研究C#和C++中SIMD算法的优势,发现在许多情况下,在AVX处理器上使用128位寄存器比在具有AVX2的处理器上使用256位寄存器提供更好的改进,但是我不明白为什么。我所说的改进是指在同一台机器上SIMD算法相对于非SIMD算法的加速。 最佳答案 在AVX处理器上,256位寄存器的上半部分和浮点单元在不执行AVX指令(VEX编码操作码)时由CPU关闭。当代码确实使用AVX指令时,CPU必须为FP单元加电——这大约需要70微秒,在此期间,AVX指令实际上使用128个微操作执行两次。当AVX指令在大约700微秒内未被使用时,

c++ - 使用 SIMD (AVX2) 进行稀疏数组压缩

我有一个稀疏数组a(主要是零):unsignedchara[1000000];我想创建一个b索引数组a在带有AVX2的英特尔x64架构上使用SIMD指令。我正在寻找如何有效地做到这一点的技巧。具体来说,是否有SIMD指令获取SIMD寄存器中连续排列的连续非零元素的位置? 最佳答案 计算非零值索引的五种方法是:半向量化循环:用字符加载SIMDvector,与零进行比较并应用移动掩码。如果任何字符非零,则使用小标量循环(也由@stgatilov建议)。这适用于非常稀疏的数组。下面代码中的函数arr2ind_movmsk使用了BMI1指令

c++ - 是否存在 stb_image simd 支持?

stb_image似乎支持idct和ycbcr->rgb转换操作的插件SIMD实现,这在加载jpeg文件时占用了大部分时间。查看STBI_SIMD背后的代码,很明显这段代码实际上已在某处使用。但是,要么实现是专有的,要么我的google-fu失败了,因为我没有找到任何使用此接口(interface)的公共(public)代码。我的需求仅适用于x86平台(此时)。有没有使用这个接口(interface)的开源软件? 最佳答案 我记得在Twitter上看到你的问题,今天巧合的是有人提到了libjpeg-turbo根据BSD许可证获得许可

c++ - SIMD 内部函数 : _mm_stream_load_si128 vs _mm_load_si128

什么时候应该使用流媒体版本以及什么时候使用SSE2与_mm_load_si128?什么是性能权衡? 最佳答案 流加载内在(mm_stream_load_si128)执行加载“使用非时间内存提示”(根据IntelIntrinsicsGuide)。这意味着加载的值不会导致从缓存中逐出任何内容。如果您将大量数据组合在一起,您将立即对其进行操作并且“很长”一段时间内不再查看,这将非常有用。最常见的情况是在流操作期间发生这种情况。当我知道我正在对一个大数据集执行一个简单的操作时,我就使用过它,我知道数据无论如何都会很快从缓存中被逐出。memc

c++ - SIMD C++ 库

我将VisualStudio与DiretXXNA数学库结合使用。现在,我使用GNU编译器集合。给我一个带有良好文档的SIMD数学库。 最佳答案 本征http://eigen.tuxfamily.org/index.php?title=Main_Page它支持开箱即用的SIMD扩展,它有很好的文档记录,它非常灵活,它提供了很多线性代数方法的高质量实现,并且具有所有重载运算符的好处。我已经将它用于多个与科学相关的项目,非常高兴,尤其是在与其他库一起玩过之后。 关于c++-SIMDC++库,我

c++ - SIMD : Why is the SSE RGB to YUV color conversion about the same speed as the c++ implementation?

我刚刚尝试优化RGB到YUV420转换器。使用查找表可以提高速度,就像使用定点算法一样。然而,我期待使用SSE指令获得真正的yield。我的第一次尝试导致代码变慢,并且在链接所有操作之后,它的速度与原始代码大致相同。我的实现是否有问题,或者SSE说明是否不适合手头的任务?部分原始代码如下:#defineRRGB24YUVCI2_000.299#defineRRGB24YUVCI2_010.587#defineRRGB24YUVCI2_020.114#defineRRGB24YUVCI2_10-0.147#defineRRGB24YUVCI2_11-0.289#defineRRGB24Y