标签: simd

良好的便携式SIMD库

任何人都可以推荐提供ac/c ++ API的便携式SIMD库,适用于Intel和AMD扩展以及兼容GCC的Visual Studio.我希望加快缩放512x512双打阵列的速度.矢量点积,矩阵乘法等

到目前为止,我找到的唯一一个是:http: //simdx86.sourceforge.net/但是第一页说它不能在visual studio上编译.

还有英特尔IPP,这对我收集的AMD不起作用.还有来自AMD的Framewave,但我在编译和链接他们的库时遇到了一些问题,他们的论坛已经完全死了.有人设法在任何地方使用Framewave吗?

谢谢.

c++ open-source cross-platform simd

23
推荐指数
2
解决办法
1万
查看次数

c ++ SSE SIMD框架

有谁知道一个开源的C++ x86 SIMD内在函数库?

英特尔在其集成性能原语库中提供了我所需要的,但由于版权所有,我无法使用它.

编辑

我已经知道编译器提供的内在函数了.我需要的是一个方便的界面来使用它们.

c++ sse simd intrinsics

22
推荐指数
4
解决办法
1万
查看次数

优化阵列压缩

假设我有一个数组 k = [1 2 0 0 5 4 0]

我可以按如下方式计算掩码 m = k > 0 = [1 1 0 0 1 1 0]

仅使用掩码m和以下操作

  1. 向左/向右移动
  2. 和/或
  3. 加/减/乘

我可以将k压缩成以下内容 [1 2 5 4]

这是我目前的做法(MATLAB伪代码):

function out = compact( in )
    d = in
    for i = 1:size(in, 2) %do (# of items in in) passes
        m = d > 0
        %shift left, pad w/ 0 on right
        ml = [m(2:end) 0] % shift
        dl = [d(2:end) 0] % shift

        %if …
Run Code Online (Sandbox Code Playgroud)

algorithm matlab sse simd

22
推荐指数
2
解决办法
2936
查看次数

IntStream 导致数组元素被错误地设置为 0(JVM 错误,Java 11)

P下面的类中,该方法test似乎返回相同false

import java.util.function.IntPredicate;
import java.util.stream.IntStream;

public class P implements IntPredicate {
    private final static int SIZE = 33;

    @Override
    public boolean test(int seed) {
        int[] state = new int[SIZE];
        state[0] = seed;
        for (int i = 1; i < SIZE; i++) {
            state[i] = state[i - 1];
        }
        return seed != state[SIZE - 1];
    }

    public static void main(String[] args) {
        long count = IntStream.range(0, 0x0010_0000).filter(new P()).count();
        System.out.println(count);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,将 classP与结合使用 …

java arrays simd java-stream java-11

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

执行__builtin_clz

GCC(4.6+)的实施是什么__builtin_clz?它是否符合英特尔的某些CPU指令x86_64 (AVX)

c cpu gcc simd

21
推荐指数
2
解决办法
2万
查看次数

打印__m128i变量

我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码

compiler used: icc

#include<stdio.h>
#include<emmintrin.h>
int main()
{
        __m128i a = _mm_set_epi32(1,2,3,4);
        __m128i b = _mm_set_epi32(1,2,3,4);
        __m128i c;
        c = _mm_add_epi32(a,b);
        printf("%d\n",c[2]);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下错误:

test.c(9): error: expression must have pointer-to-object type
        printf("%d\n",c[2]);
Run Code Online (Sandbox Code Playgroud)

如何在c类型变量中打印值__m128i

c assembly sse simd intrinsics

21
推荐指数
3
解决办法
2万
查看次数

如何执行_mm256_movemask_epi8(VPMOVMSKB)的反转?

内在的:

int mask = _mm256_movemask_epi8(__m256i s1)
Run Code Online (Sandbox Code Playgroud)

创建一个掩码,其32位对应于每个字节的最高位s1.在使用位操作(BMI2例如)操作掩码之后,我想执行反转_mm256_movemask_epi8,即创建一个__m256i向量,每个字节的最高有效位包含相应的位uint32_t mask.

做这个的最好方式是什么?

编辑:我需要执行逆操作,因为内在函数_mm256_blendv_epi8只接受__m256i类型掩码而不是uint32_t.因此,在结果__m256i掩码中,我可以忽略除每个字节的MSB之外的位.

c x86 simd avx avx2

21
推荐指数
2
解决办法
4378
查看次数

Intel cpu上的SIMD前缀和

我需要实现前缀和算法,并且需要它尽可能快.例如:

[3, 1,  7,  0,  4,  1,  6,  3]
Run Code Online (Sandbox Code Playgroud)

有没有办法使用SSE/mmx/SIMD cpu指令执行此操作?

我的第一个想法是递归并行地对每一对求和,直到所有的总和都计算如下!

[3, 4, 11, 11, 15, 16, 22, 25]
Run Code Online (Sandbox Code Playgroud)

为了使算法更清晰,"z"不是最终的输出

而是用来计算输出

//in parallel do 
for (int i = 0; i < z.length; i++) {
    z[i] = x[i << 1] + x[(i << 1) + 1];
}
Run Code Online (Sandbox Code Playgroud)

c++ sse simd prefix-sum

20
推荐指数
5
解决办法
6755
查看次数

快速,无分支无符号int绝对差异

我有一个程序,它花费大部分时间来计算RGB值之间的欧几里德距离(无符号8位的3元组Word8).我需要一个快速,无分支的无符号int绝对差函数

unsigned_difference :: Word8 -> Word8 -> Word8
unsigned_difference a b = max a b - min a b
Run Code Online (Sandbox Code Playgroud)

特别是,

unsigned_difference a b == unsigned_difference b a

我使用GHC 7.8中的新初学者提出了以下内容:

-- (a < b) * (b - a) + (a > b) * (a - b)
unsigned_difference (I# a) (I# b) =
    I# ((a <# b) *# (b -# a) +# (a ># b) *# (a -# b))]
Run Code Online (Sandbox Code Playgroud)

ghc -O2 -S编译成

.Lc42U:
    movq 7(%rbx),%rax
    movq $ghczmprim_GHCziTypes_Izh_con_info,-8(%r12)
    movq …
Run Code Online (Sandbox Code Playgroud)

performance haskell bit-manipulation simd

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

SSE-copy,AVX-copy和std :: copy性能

我试图通过SSE和AVX提高复制操作的性能:

    #include <immintrin.h>

    const int sz = 1024;
    float *mas = (float *)_mm_malloc(sz*sizeof(float), 16);
    float *tar = (float *)_mm_malloc(sz*sizeof(float), 16);
    float a=0;
    std::generate(mas, mas+sz, [&](){return ++a;});

    const int nn = 1000;//Number of iteration in tester loops    
    std::chrono::time_point<std::chrono::system_clock> start1, end1, start2, end2, start3, end3; 

    //std::copy testing
    start1 = std::chrono::system_clock::now();
    for(int i=0; i<nn; ++i)
        std::copy(mas, mas+sz, tar);
    end1 = std::chrono::system_clock::now();
    float elapsed1 = std::chrono::duration_cast<std::chrono::microseconds>(end1-start1).count();

    //SSE-copy testing
    start2 = std::chrono::system_clock::now();
    for(int i=0; i<nn; ++i)
    {
        auto _mas = mas;
        auto _tar = tar; …
Run Code Online (Sandbox Code Playgroud)

c++ performance sse simd avx

19
推荐指数
2
解决办法
1万
查看次数