标签: sse

_mm_类型函数的等效C代码

什么是简单的等效C代码,克服像__功能_mm_store_ps,_mm_add_ps等等,请通过与等价的C代码的例子指定任何功能.

为什么使用这些功能?

c windows sse

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

SSE:_mm_mul_ps不会正确地将10001与10001相乘,但10000可以正常工作10000

我有一个非常简单的程序来乘以四个数字.它们每个都是10000时工作正常,但如果我将它们改为10001则没有.结果是一个.

gcc -msse2 main_sse.c -o sse在AMD Opteron和Intel Xeon上编译了这个程序,并在两台机器上得到了相同的结果.

我将不胜感激任何帮助.在这个主题上无法在线找到任何内容.

#include <stdlib.h>
#include <stdio.h>
#include <xmmintrin.h>

int main(){

    float x[4], y[4], temp[4]; int i;  __m128 X, Y, result;

    for(i=0; i < 4; i++) { x[i] = 10000; y[i] = 10000; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);

    for(i=0; i < 4; i++) { x[i] = 10001; y[i] = 10001; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);
}
Run Code Online (Sandbox Code Playgroud)

x86 sse simd

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

128位整数之间的按位运算

我有一个关于使用128位寄存器来提高代码速度的问题.考虑下面的C/C++代码:我定义了两个unsigned long long int小号ab,并给他们一些价值.

unsigned long long int a = 4368, b = 56480;
Run Code Online (Sandbox Code Playgroud)

然后,我想计算

a & b;
Run Code Online (Sandbox Code Playgroud)

这里a在计算机中表示为64位数字4369 = 100010001001,并且相同b = 56481 = 1101110010100001,我计算a & b,它仍然是由a和b之间的逐位逻辑AND给出的64位数字:

a & b = 1000000000001
Run Code Online (Sandbox Code Playgroud)

我的问题如下:计算机是否有128位寄存器,我可以在上面进行操作,但是使用128位整数而不是64位整数,并且具有相同的计算机时间?更清楚一点:我想通过使用128位数而不是64位数来获得代码速度的两倍,例如我想计算128个AND而不是64个AND(每个位一个AND)电脑时间.如果可以的话,你有代码示例吗?我听说SSE的管理员可能会这样做,但我不确定.

c sse bit-manipulation logical-operators

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

如何将SSE应用于长度不保证为4的倍数的数组?

我目前正在使用以下功能:

 void vadd(float * a, float * b, int n){
     for(int i = 0; i < n; i++){
         a[i] += b[i];
     }
 }
Run Code Online (Sandbox Code Playgroud)

这个循环基本上可以用SSE重写,但我的问题是如果n不是4的倍数,如何处理遗漏的少数元素?

非常感谢,鲍勃

c optimization sse vectorization

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

在__m128i向量上水平检查零?

我有几个__m128i包含32位无符号整数的向量,我想检查4个整数中的任何一个是否为零.

我理解如何"聚合"多个__m128i向量,但最终我仍然会得到一个__m128i向量,然后我需要水平检查.

如何在最后一个矢量上执行零的最终水平检查?

编辑我使用英特尔内在函数,而不是内联汇编

c++ sse intel vectorization avx

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

xmm,cmp两个32位浮点数

我试图了解如何使用xmm寄存器比较两个浮点数(32位).为了测试我在C中编写了这段代码(在程序集中调用代码):

#include "stdio.h"

extern int compare();

int main()
{

    printf("Result: %d\n", compare());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是程序集,我想测试是否b <c,在这种情况下确实如此,代码应返回1,但它返回0:

section .data

a:  dd 5.5555
b:  dd 1.1111
c:  dd 5.5555

section .text

global compare

compare:
            ; -------------------------------------------
            ; Entrace sequence
            ; -------------------------------------------
            push    ebp         ; save base pointer
            mov     ebp, esp    ; point to current stack frame 
            push    ebx         ; save general registers
            push    ecx
            push    edx
            push    esi         
            push    edi

            movss xmm0, [b]
            movss xmm1, [c]
            comiss xmm0, xmm1
            jl change …
Run Code Online (Sandbox Code Playgroud)

floating-point assembly sse

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

声明一个带有指针的联合指针

我正在努力学习SSE指令,我渴望增加两个方面.但是,当我尝试初始化其中一个时,程序崩溃了

键入位置时访问冲突

这是抛出错误的代码:

typedef union{
    __m128 vec;
    float* afloat;
}u_float;

int main(){

__declspec(align(16)) u_float *mat1;

mat1 = (u_float*)malloc(sizeof(u_float)*4);
for(int i = 0; i < 4; i++)
    mat1[i].afloat = (float*)malloc(sizeof(float)*4);

for(int i = 0; i < 4; i++)
    for(int j = 0; i < 4; j++)
            mat1[i].afloat[j] = 1; // Error.

return 0;}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么会抛出这个错误?
  2. 哪个是解决问题的最佳方法?

c++ malloc sse unions

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

SSE到霓虹灯(_mm_movelh_ps)

我将一些SSE代码移动到Neon,我找不到与_mm_movelh_ps相同的任何东西.我谷歌相当有点找不到任何东西......我错过了什么?有没有任何霓虹功能做同样的事情或我将不得不在CPU上实现它(不理想).

提前致谢!

c sse neon

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

是不是__m128d本地对齐?

我有这个代码:

double a[bufferSize];
double b[voiceSize][bufferSize];
double c[voiceSize][bufferSize];

...

inline void AddIntrinsics(int voiceIndex, int blockSize) {
    // assuming blockSize / 2 == 0 and voiceIndex is within the range
    int iters = blockSize / 2;
    __m128d *pA = (__m128d*)a;
    __m128d *pB = (__m128d*)b[voiceIndex];
    double *pC = c[voiceIndex];

    for (int i = 0; i < iters; i++, pA++, pB++, pC += 2) {
        _mm_store_pd(pC, _mm_add_pd(*pA, *pB));
    }   
}
Run Code Online (Sandbox Code Playgroud)

但是,"有时",它提高访问内存冲突,我认为它是由于缺少我的3个数组的内存对齐的a,bc.

但是,由于我操作__m128d(使用__declspec(align(16))),当我转换为指针时,是否保证对齐? …

c++ sse simd memory-alignment intrinsics

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

使用向量化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
查看次数