标签: simd

如何使用SSE2加载16 x 8位整数

假设我有16个8位整数,我想将它们加载到__m128i使用SSE2中:

__m128i v = _mm_set_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
Run Code Online (Sandbox Code Playgroud)

我可以静态使用,_mm_set_epi8但我想动态地这样做; 值将在运行时决定.

C = userinput;
for(int i=0; i<16; i++)
{
    load C*i on v at position i
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

x86 sse simd sse2

1
推荐指数
1
解决办法
5590
查看次数

SIMD:翻转四个打包整数的符号

假设我有四个打包的整数.

__m128i val = _mm_set_epi32(42,64,123,456);
Run Code Online (Sandbox Code Playgroud)

在val中翻转四个整数的符号(乘以-1)的最快方法是什么?

c++ simd

1
推荐指数
1
解决办法
383
查看次数

使用Swift初始化int4; 错误或预期的行为?

游乐场代码:

import simd

let test = int4(1,2,3,4) // this works

let x = 1
let test2 = int4(x,2,3,4) // doesn't work (nor does let x: Int = 1)

let y: Int32 = 1
let test3 = int4(y,2,3,4) // works
Run Code Online (Sandbox Code Playgroud)

很显然,int4期望Int32的值,但在第一种情况下它似乎能推测出来而不显式指定Int的类型,但在第二种情况下(当整数首先被存储作为单独的变量)它没有.

这是Swift的预期行为吗?

simd swift ios9 swift2

1
推荐指数
1
解决办法
167
查看次数

任何方法将基于AVX512 cpu intrinics的unsigned char转换为short?

我只是在Xeon Phi处理器中读取AVX内置的AVX512集,但似乎sse中的传统数据类型转换方法在avx512中不起作用,所以我可以问一下avx512中是否有任何类似的cpu设置可以转换unsigned char数组到短数据类型数组?提前致谢!

sse simd xeon-phi avx512

1
推荐指数
1
解决办法
159
查看次数

手动SIMD代码可承受性

我们正在运行一个计算密集程度很高的项目,现在我们让编译器进行SSE优化.但是,我们不确定我们是否获得了代码的最佳性能.

我的理解是,我的理解是广泛的,但我没有找到很多关于此的建议:编写手工SIMD代码是否可以负担得起,或者换句话说值得努力?

在这里,可负担性意味着对成本效益的粗略估计,例如speedup / development_time,或在项目开发背景下合理的任何其他措施.

减少范围:

  • 我们分析了代码,我们知道计算是最重要的部分
  • 我们有一个C++代码,可以很容易地使用Boost.SIMD和类似的库
  • 负担能力不应该考虑代码的可读性,我们假设我们对SSE/AVX充满信心
  • 代码目前是多线程的(OpenMP)
  • 我们的编译器是英特尔的 icc

c++ performance x86 simd compiler-optimization

1
推荐指数
1
解决办法
234
查看次数

模乘法的矢量化

我有一个功能:

void Func(const int * a, const int * b, size_t size, int p, int * c)
{
    for (size_t i = 0; i < size; ++i)
        c[i] = (a[i]*b[i])%p;
}
Run Code Online (Sandbox Code Playgroud)

此函数对整数数组执行许多模乘.所有整数都是正数.我需要提高其性能.

我想到了SSE和AVX.但它们没有向量化乘法的矢量化操作.或许我错了?

也许有人知道解决这个问题的任何可能性吗?

c++ algorithm sse simd avx

1
推荐指数
1
解决办法
342
查看次数

System.Numerics.Vectors'Vector <T>':它基本上只是System.UInt128吗?

我正在查看版本4.5.0-preview1-26216-02Vector<T>System.Numerics.Vectors命名空间.MSDN文档说:

Vector<T>是一个不可变的结构,表示指定数字类型的单个向量.实例的计数Vector<T>是固定的,但其上限取决于CPU寄存器.
https://docs.microsoft.com/en-us/dotnet/api/system.numerics.vector-1(强调添加)

即使忽略误导的措辞" 计算向量的数量 [sic.] ",这句话似乎还不清楚,因为它暗示不同的Vector<T>实例可能有不同的 - 尽管"固定"到某些CPU限制 - "计数"(再次,究竟是什么'所谓的'计数'?)这里没有提到实际的Count属性 - 或者实际上在介绍页面的任何地方都没有提到.

现在通常情况下,我认为"只读""不可变"在描述实例的属性或字段时比传统上使用"固定",但在这种情况下,事实证明该Vector<T>.Count属性虽然是只读的,但也是静态的,因此与任何Vector<T> 实例无关.相反,它的值仅根据泛型类型参数而变化T(然后可能来自机器到机器,如图所示):

bool hw = Vector.IsHardwareAccelerated;    // --> true

var c = (Vector<sbyte>.Count, Vector<short>.Count, Vector<int>.Count, Vector<long>.Count);
Debug.WriteLine(c);    // -->  (16, 8, 4, 2)
Run Code Online (Sandbox Code Playgroud)

哦.

它基本上System.Int128是伪装的吗?是吗?我的问题是:

  • 我错过了什么吗?这是真的,我知之甚少SIMD,但我认为这个库将允许使用的多少不是仅仅128位的更广泛的硬件加速的数据类型.我的HPSG解析引擎通常执行5,000+位的密集位计算向量.
  • 再假设我没有错过这一点,为什么不把它称为System.Int128/ …

.net bit-manipulation simd hardware-acceleration

1
推荐指数
1
解决办法
970
查看次数

计算N组交叉点的快速算法

我有n套A0,A2,...... An-1持有一套E的物品.

我将配置C定义为由n位组成的整数,因此C的值介于0和2 ^ n-1之间.现在,我定义以下内容:

(C)   an item e of E is in configuration C 
       <=> for each bit b of C, if b==1 then e is in Ab, else e is not in Ab
Run Code Online (Sandbox Code Playgroud)

例如,对于n = 3,配置C = 011对应于在A0和A1中但不在A2中的E项(NOT是重要的)

C[bitmap]是在集合中具有完全存在/不存在模式的元素的数量. C[001]是A0中不在任何其他集合中的元素数量.


另一个可能的定义是:

(V)   an item e of E is in configuration V 
       <=> for each bit b of V, if b==1 then e is in Ab
Run Code Online (Sandbox Code Playgroud)

例如,对于n = 3,(V)配置V = 011对应于A0和A1中的E项

V[bitmap]是所选集合的交集计数. (即位图为真的所有集合中有多少个元素的计数.) V[001]是A0中元素的数量. V[011] …

c++ algorithm intersection simd set

1
推荐指数
1
解决办法
474
查看次数

_m_test_all_zeros的__m256i版本

我知道如何使用_mm_test_all_zeros固有函数测试_m128i寄存器是否全部为零。

此内在函数的AVX2 / __ m256i版本是什么?如果一个不可用,测试SIMD寄存器中所有256位是否均为零的最快方法是什么?

simd intrinsics avx avx2

1
推荐指数
1
解决办法
112
查看次数

python为什么不能向量化map()或列表推导

我对向量化了解不多,但是我想了解为什么像python这样的语言无法通过库接口在可迭代对象上提供向量化,就像它提供线程支持一样。我知道许多numpy方法都是矢量化的,但是对于通用计算必须使用numpy可能会受到限制。

我目前的理解是,即使python与“ SIMD”模式匹配,它们也无法向量化它们。例如,理论上不应该对列表的理解或对该map()函数的使用进行矢量化处理,因为它们会输出一个列表,这是对来自输入列表的独立输入运行相同功能的结果吗?

凭着我的敏锐理解,似乎map()从理论上讲,无论何时我使用,我都应该能够创建一个代表该功能的指令集。那么输入中的每个元素只需通过已编译的同一函数运行即可。设计一种工具的技术挑战是什么,该工具会simd_map(func, iterable)尝试func“及时” 编译,然后从iterable处理器中提取批输入并利用处理器的simd功能来运行这些批处理func()

谢谢!

python parallel-processing simd vectorization python-multiprocessing

1
推荐指数
1
解决办法
78
查看次数