下面是函数,单核跑耗时0.26ms,分到四核跑耗时0.21ms,为什么会节约这么少的时间呢?一般函数分到四核跑至少要降低一半的时间啊?
#pragma CODE_SECTION(DSPF_sp_dotp_vec_cplx, ".text:optimized");
#include "DSPF_sp_dotp_vec_cplx.h"
void DSPF_sp_dotp_vec_cplx(const float * x, const float * y, int nx,
float * z)
{
int i;
double x0_re_im, y0_re_im, result0 = 0;
double x1_re_im, y1_re_im, result1 = 0;
double x2_re_im, y2_re_im, result2 = 0;
double x3_re_im, y3_re_im, result3 = 0;
_nassert(nx % 4 == 0);
_nassert(nx > 0);
_nassert((int)x % 8 == 0);
_nassert((int)y % 8 == 0);
for(i = 0; i < 2 * nx; i += 8)
{ /* load 4 sets of input data */
x0_re_im = _amemd8((void*)&x[i]);
y0_re_im = _amemd8((void*)&y[i]);
x1_re_im = _amemd8((void*)&x[i+2]);
y1_re_im = _amemd8((void*)&y[i+2]);
x2_re_im = _amemd8((void*)&x[i+4]);
y2_re_im = _amemd8((void*)&y[i+4]);
x3_re_im = _amemd8((void*)&x[i+6]);
y3_re_im = _amemd8((void*)&y[i+6]);
/* calculate 4 running sums */
result0 = _complex_mpysp(x0_re_im, y0_re_im);
result1 = _complex_mpysp(x1_re_im, y1_re_im);
result2 = _complex_mpysp(x2_re_im, y2_re_im);
result3 = _complex_mpysp(x3_re_im, y3_re_im);
z[i]=_hif(result0);
z[i+1] = _lof(result0);
z[i+2]=_hif(result1);
z[i+3] = _lof(result1);
z[i+4]=_hif(result2);
z[i+5] = _lof(result2);
z[i+6]=_hif(result3);
z[i+7] = _lof(result3);
}
}
Andy Yin1:
你是怎么分的,是将一份数据均分到多个core上进行相同的处理么。
Zhao Yan1:
回复 Andy Yin1:
数据分成了四份,一个核算一份的,大概就是下面的:
int num = FFTSIZE >> 2; // 每一个core要计算的复数个数 int step = num << 1; // 每一个core得到的float型数据个数(采样数) int start = coreNum * step;//起始位置
DSPF_sp_dotp_vec_cplx(&InData1[start], &InData2[start], num,&OutData1[start]);
Zhao Yan1:
回复 Zhao Yan1:
这么分应该是对的吧?是函数本身有问题吗?不知道出问题出在哪里,算出的结果也是正确的啊
Zhao Yan1:
回复 Andy Yin1:
用的Intrinsics改的库函数,为了节约时间,然后分到四核,难道行不通嘛?