任何人都可以推荐提供ac/c ++ API的便携式SIMD库,适用于Intel和AMD扩展以及兼容GCC的Visual Studio.我希望加快缩放512x512双打阵列的速度.矢量点积,矩阵乘法等
到目前为止,我找到的唯一一个是:http: //simdx86.sourceforge.net/但是第一页说它不能在visual studio上编译.
还有英特尔IPP,这对我收集的AMD不起作用.还有来自AMD的Framewave,但我在编译和链接他们的库时遇到了一些问题,他们的论坛已经完全死了.有人设法在任何地方使用Framewave吗?
谢谢.
有谁知道一个开源的C++ x86 SIMD内在函数库?
英特尔在其集成性能原语库中提供了我所需要的,但由于版权所有,我无法使用它.
编辑
我已经知道编译器提供的内在函数了.我需要的是一个方便的界面来使用它们.
假设我有一个数组
k = [1 2 0 0 5 4 0]
我可以按如下方式计算掩码
m = k > 0 = [1 1 0 0 1 1 0]
仅使用掩码m和以下操作
我可以将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) 在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与结合使用 …
GCC(4.6+)的实施是什么__builtin_clz?它是否符合英特尔的某些CPU指令x86_64 (AVX)?
我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码
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
内在的:
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之外的位.
我需要实现前缀和算法,并且需要它尽可能快.例如:
[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) 我有一个程序,它花费大部分时间来计算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) 我试图通过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) simd ×10
sse ×5
c++ ×4
c ×3
avx ×2
intrinsics ×2
performance ×2
algorithm ×1
arrays ×1
assembly ×1
avx2 ×1
cpu ×1
gcc ×1
haskell ×1
java ×1
java-11 ×1
java-stream ×1
matlab ×1
open-source ×1
prefix-sum ×1
x86 ×1