下面是Ti官方求解最小值的c代码,当矢量x次原数个数不是4的倍数,还能用吗?
#pragma CODE_SECTION(DSPF_sp_minval, ".text:optimized");
//#include "DSPF_sp_minval.h"
#include "float.h"
float DSPF_sp_minval(const float* restrict x, int nx)
{
int i;
float x0, x1, x2, x3, min0, min1, min2, min3;
double x_01, x_23;
min0 = FLT_MAX;
min1 = FLT_MAX;
min2 = FLT_MAX;
min3 = FLT_MAX;
_nassert(nx % 4 == 0);
_nassert(nx > 0);
_nassert((int)x % 8 == 0);
#pragma MUST_ITERATE(1,,)
for (i = 0; i < nx; i+=4)
{
x_01 = _amemd8((void*)&x[i]);
x_23 = _amemd8((void*)&x[i+2]);
x0 = _hif(x_01);
x1 = _lof(x_01);
x2 = _hif(x_23);
x3 = _lof(x_23);
if (x0 < min0)
min0 = x0;
if (x1 < min1)
min1 = x1;
if (x2 < min2)
min2 = x2;
if (x3 < min3)
min3 = x3;
}
if (min0 < min1)
min1 = min0;
if (min2 < min3)
min3 = min2;
if (min3 < min1)
return min3;
else return min1;
}
rookiecalf:
程序中首先就有4的倍数的断言,如果不是4的倍数的话,你是否可以用较大值进行补齐?
Jiao Li:
回复 rookiecalf:
谢谢您的解答,您的意思是,在调用该程序之前,先要把X矢量的元素个数补齐为4的倍数。
Jiao Li:
回复 Jiao Li:
如果有多个矢量在内存排列,补齐过程会不会破坏内存其它变量,这时如何处理。
rookiecalf:
回复 Jiao Li:
不是很明白你说的矢量的用法。我觉得你所说的矢量空间的预定义就得是4的倍数,而补齐的过程只是填充剩余的几个位置,那样就不会造成空间的溢出。不知道你的数据操作机理是什么样的,不过你得确保不会出现你说得这个问题。
Jiao Li:
回复 rookiecalf:
谢谢您的关注,不幸的事,我用的矢量(数组)的长度是任意的,并不是4或2的倍数,而且有多个矢量(数组).,主要进行复数(浮点)矢量算法的优化。
这种情况,扩展数组很可能破坏内存关系,把别的矢量破坏。望大侠给予指点。
rookiecalf:
回复 Jiao Li:
Jiao Li
谢谢您的关注,不幸的事,我用的矢量(数组)的长度是任意的,并不是4或2的倍数���而且有多个矢量(数组).,主要进行复数(浮点)矢量算法的优化。
这种情况,扩展数组很可能破坏内存关系,把别的矢量破坏。望大侠给予指点。