【发布时间】:2018-05-18 09:53:20
【问题描述】:
我开始使用 SIMD 编程,但我现在不知道该做什么。我正在尝试减少运行时间,但它以另一种方式进行。
这是我的基本代码: https://codepaste.net/a8ut89
void blurr2(double * u, double * r) {
int i;
double dos[2] = { 2.0, 2.0 };
for (i = 0; i < SIZE - 1; i++) {
r[i] = u[i] + u[i + 1];
}
}
模糊2:0.43s
int contarNegativos(double * u) {
int i;
int contador = 0;
for (i = 0; i < SIZE; i++) {
if (u[i] < 0) {
contador++;
}
}
return contador;
}
负数:1.38s
void ord(double * v, double * u, double * r) {
int i;
for (i = 0; i < SIZE; i += 2) {
r[i] = *(__int64*)&(v[i]) | *(__int64*)&(u[i]);
}
}
ord:0.33
这是我的 SIMD 代码:
void blurr2(double * u, double * r) {
__m128d rp2;
__m128d rdos;
__m128d rr;
int i;
int sizeAux = SIZE % 2 == 1 ? SIZE : SIZE - 1;
double dos[2] = { 2.0, 2.0 };
rdos = *(__m128d*)dos;
for (i = 0; i < sizeAux; i += 2) {
rp2 = *(__m128d*)&u[i + 1];
rr = _mm_add_pd(*(__m128d*)&u[i], rp2);
*((__m128d*)&r[i]) = _mm_div_pd(rr, rdos);
}
}
模糊2:0.42s
int contarNegativos(double * u) {
__m128d rcero;
__m128d rr;
int i;
double cero[2] = { 0.0, 0.0 };
int contador = 0;
rcero = *(__m128d*)cero;
for (i = 0; i < SIZE; i += 2) {
rr = _mm_cmplt_pd(*(__m128d*)&u[i], rcero);
if (((__int64 *)&rr)[0]) {
contador++;
};
if (((__int64 *)&rr)[1]) {
contador++;
};
}
return contador;
}
负数:1.42s
void ord(double * v, double * u, double * r) {
__m128d rr;
int i;
for (i = 0; i < SIZE; i += 2) {
*((__m128d*)&r[i]) = _mm_or_pd(*(__m128d*)&v[i], *(__m128d*)&u[i]);
}
}
ord:0.35s
**不同的解决方案。
你能解释一下我做错了什么吗?我有点迷茫……
【问题讨论】:
-
请发布显示问题的Minimal, Complete, and Verifiable example。将输入、预期输出和实际输出显示为问题中的文本。我不会点击你的链接。
-
您是否检查过编译器是否已经在“基本代码”案例中为您自动矢量化了代码?
-
@geza 他们是不同的解决方案
-
blurr2:乘以
0.5而不是除以 2。它会快得多。 (我在最后一两天用完全相同的代码对一个问题发表了同样的评论,你也是吗?) -
@PeterCordes 哎呀,旧代码,我改了,它更快了! (是的,但他们删除了我的问题不知道为什么......)
标签: c++ c performance sse simd