什么是简单的等效C代码,克服像__功能_mm_store_ps,_mm_add_ps等等,请通过与等价的C代码的例子指定任何功能.
为什么使用这些功能?
我有一个非常简单的程序来乘以四个数字.它们每个都是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) 我有一个关于使用128位寄存器来提高代码速度的问题.考虑下面的C/C++代码:我定义了两个unsigned long long int小号a和b,并给他们一些价值.
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的管理员可能会这样做,但我不确定.
我目前正在使用以下功能:
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的倍数,如何处理遗漏的少数元素?
非常感谢,鲍勃
我有几个__m128i包含32位无符号整数的向量,我想检查4个整数中的任何一个是否为零.
我理解如何"聚合"多个__m128i向量,但最终我仍然会得到一个__m128i向量,然后我需要水平检查.
如何在最后一个矢量上执行零的最终水平检查?
编辑我使用英特尔内在函数,而不是内联汇编
我试图了解如何使用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) 我正在努力学习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)
我将一些SSE代码移动到Neon,我找不到与_mm_movelh_ps相同的任何东西.我谷歌相当有点找不到任何东西......我错过了什么?有没有任何霓虹功能做同样的事情或我将不得不在CPU上实现它(不理想).
提前致谢!
我有这个代码:
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,b和c.
但是,由于我操作__m128d(使用__declspec(align(16))),当我转换为指针时,是否保证对齐? …
我正在尝试编写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; …