标签: simd

使用SSE(x*x*x)+(y*y*y)进行乘法

我正在尝试使用SIMD优化此功能,但我不知道从哪里开始.

long sum(int x,int y)
{
    return x*x*x+y*y*y;
}
Run Code Online (Sandbox Code Playgroud)

反汇编函数如下所示:

  4007a0:   48 89 f2                mov    %rsi,%rdx
  4007a3:   48 89 f8                mov    %rdi,%rax
  4007a6:   48 0f af d6             imul   %rsi,%rdx
  4007aa:   48 0f af c7             imul   %rdi,%rax
  4007ae:   48 0f af d6             imul   %rsi,%rdx
  4007b2:   48 0f af c7             imul   %rdi,%rax
  4007b6:   48 8d 04 02             lea    (%rdx,%rax,1),%rax
  4007ba:   c3                      retq   
  4007bb:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
Run Code Online (Sandbox Code Playgroud)

调用代码如下所示:

 do {
for (i = 0; i < maxi; i++) { …
Run Code Online (Sandbox Code Playgroud)

c x86 sse simd

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

x86-64上最快的方法来检查指针范围是否跨越N字节对齐的地址?

给定一个指向T的指针,我想确定T是否跨越N字节对齐的地址.在实践中我真的只关心0-5字节大小的对象是否跨越8或16字节字节边界,但我写了这个通用版本:

template<class T, unsigned long N>
bool straddlesBoundary(T* obj)
{
    unsigned long before = (unsigned long)obj & ~(N-1);
    unsigned long after  = ((unsigned long)obj + sizeof(T) - 1) & ~(N-1);
    return before != after;
}
Run Code Online (Sandbox Code Playgroud)

基本上,将地址向下舍入到最接近的N字节对齐地址,然后将指针增量乘以T的大小减1(因为T在下一个边界上的右边不算作跨骑)并将其向下舍入到最近N字节对齐的地址,如果匹配,则表示它不会跨越.

有更快的方法吗?我刚刚做了这个,我不知道是否有标准检查.

编辑:注意,我假设T小于N.

c++ bit-manipulation x86-64 simd alignment

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

loadu和load之间有什么区别?

什么更有效,为什么?

具体地_mm_loadu_si128_mm_load_si128在C.

(编者注:或者这是标记的程序集,可能它们意味着movdqumovdqa手写的asm.这是一样的,特别是没有AVX,因为_mm_load_si128可以编译成ALU指令的内存操作数而根本没有单独movdqa的.)

x86 assembly sse simd intrinsics

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

有没有人知道如何使用Neon内在函数uint8x8_t vclt_s8(int8x8_t,int8x8_t)

我想比较2 int8x8_t,从http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html 我们可以得到描述vclt_s8,但它没有告诉我们太多的细节.

`uint8x8_t vclt_s8 (int8x8_t, int8x8_t)`
Run Code Online (Sandbox Code Playgroud)

预期指令的形式:vcgt.s8 d0,d0,d0

返回值uint8x8_t,它让我感到困惑,因为我无法 if(vclt_s8(a, b))决定第一个是否更小.

那么假设我们有两个int8x8_t:int8x8_t a而且int8x8_t b,我们怎么知道它是否a更小?

arm simd intrinsics neon

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

霓虹灯:isnan(val)内在函数

我想isnan()在NEON内在函数中使用功能.Below是我的代码:input1,input2和输出类型为float.这些值从输入图像/帧的ROI更新.(图像处理示例)

for(x = 0;x<ht;x++){
for(y = 0;y<width;y++){
float a  = (input1[x + (y * width)]);
float b  = (input2[x + (y * width)]);
// check for division by zero
output = 0.0f;
if (!(isnan(a) | isnan(b) | (b == 0)))
{
        output[x + (y * width)] = a / b;
}
}
Run Code Online (Sandbox Code Playgroud)

}

通过使用牛顿Raphson方法,我试图通过使用氖内在进行除法.但是我无法获得任何内在函数.isnan我得到了 __builtin_isnan()这不是一个内在函数.我怎么能isnan用于float32x4_t afloat32x4_t b

arm simd neon cortex-a8

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

SIMD内在和内存总线大小 - CPU如何读取单个内存中的所有128/256位读取?

你好论坛 - 我有一些关于SIMD内在的类似/相关问题我在网上搜索了包括stackoverflow但没有找到好的答案所以请求你的帮助.

基本上我试图理解64位CPU如何在一次读取中获取所有128位,以及这种操作的要求是什么.

  1. CPU会在单个内存操作中从内存中获取所有128位还是会进行两次64位读取?
  2. CPU制造商是否需要一定大小的内存总线,例如,对于64位CPU,英特尔需要128位总线来进行SSE内存绑定操作吗?
  3. 这些操作是否依赖于内存总线大小,通道数和内存模块数量?

sse x86-64 simd cpu-architecture memory-bandwidth

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

SSE 2及更高版本 - 为什么浮点数据类型仅存储2个浮点数

我试图使用SSE内部函数优化我的代码.在浏览完文档后,我发现__m128SSE中有浮点变量的数据类型,能够存储4个浮点数.__m128dSSE2中只有一个能够存储2个浮点数吗?这些变量有什么区别?SSE2不应该比SSE快吗?

x86 sse simd sse2

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

用另一个替换一个字节

我发现在为这个看似简单的问题创建代码时遇到了困难.

给定一个打包的8位整数,如果存在则用另一个字节替换另一个字节

举例来说,我想替换0x060x01,所以我可以做以下res的输入找到0x06:

// Bytes to be manipulated
res = _mm_set_epi8(0x00, 0x03, 0x02, 0x06, 0x0F, 0x02, 0x02, 0x06, 0x0A, 0x03, 0x02, 0x06, 0x00, 0x00, 0x02, 0x06);

// Target value and substitution
val = _mm_set1_epi8(0x06);
sub = _mm_set1_epi8(0x01);

// Find the target
sse = _mm_cmpeq_epi8(res, val);

// Isolate target
sse = _mm_and_si128(res, sse);

// Isolate remaining bytes
adj = _mm_andnot_si128(sse, res);
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何继续or这两个部分,我需要删除目标并用替换的字节替换它.

我在这里缺少什么SIMD指令?

和其他问题一样,我只限于AVX,我没有更好的处理器.

sse simd avx

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

如何使用_mm_extract_epi8函数?

我正在使用_mm_extract_epi8 (__m128i a, const int imm8)函数,它有const int参数.当我编译此c ++代码时,收到以下错误消息:

错误C2057预期的常量表达式

__m128i a;

for (int i=0; i<16; i++)
{
    _mm_extract_epi8(a, i); // compilation error
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在循环中使用这个功能?

c++ sse simd vectorization visual-studio

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

使用向量化C ++的矩阵乘法

我正在尝试编写C ++代码以使用SIMD进行矩阵乘法,但是结果是错误的,这是我的代码

    void mat_sse(DATA m1[][SIZE], DATA m2[][SIZE], DATA mout[][SIZE])
{

    DATA prod = 0;

    __m128 X, Y, Z, M, N;

    for(int i=0; i<SIZE; i=i+1){
    Z[0] = Z[1] = Z[2] = Z[3] = 0;
    for(int k=0; k< SIZE; k=k+4){

        for( int j=0; j<SIZE; j=j+4){
            X = _mm_load_ps(&m1[i][k]);
            Y = _mm_load_ps(&m2[k][j]);
            M = _mm_mul_ps(X, Y);
            Z = _mm_add_ps(M, N);
            mout[i][j] += Z[0];
        mout[i][j+1] += Z[1];
        mout[i][j+2] += Z[2];
        mout[i][j+3] += Z[3];
        }

    }

    }

    return ;

}
Run Code Online (Sandbox Code Playgroud)

const int SIZE = 40; …

c++ sse simd matrix-multiplication

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