如何在C6678 DSP上使用SSE指令集?

ZX.*_*X.L 3 c++ sse signal-processing simd texas-instruments

SSE 只能在 x86 x64 CPU 上使用。我在 TI C6678 上使用 SPEEXDSP 库时遇到问题。我从来没有使用过SSE指令,我尝试了很多方法,但无法让它在DSP上工作。

是否可以将SSE指令修改为普通的C++指令?如何修改呢?期待你的答复。例子:

static inline double interpolate_product_double(const float* a, const float* b, unsigned int len, const spx_uint32_t oversample, float* frac) {
int i;
double ret;
__m128d sum;
__m128d sum1 = _mm_setzero_pd();
__m128d sum2 = _mm_setzero_pd();
__m128 f = _mm_loadu_ps(frac);
__m128d f1 = _mm_cvtps_pd(f);
__m128d f2 = _mm_cvtps_pd(_mm_movehl_ps(f, f));
__m128 t;
for (i = 0; i < len; i += 2)
{
    t = _mm_mul_ps(_mm_load1_ps(a + i), _mm_loadu_ps(b + i * oversample));
    sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
    sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));

    t = _mm_mul_ps(_mm_load1_ps(a + i + 1), _mm_loadu_ps(b + (i + 1) * oversample));
    sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
    sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
}
sum1 = _mm_mul_pd(f1, sum1);
sum2 = _mm_mul_pd(f2, sum2);
sum = _mm_add_pd(sum1, sum2);
sum = _mm_add_sd(sum, _mm_unpackhi_pd(sum, sum));
_mm_store_sd(&ret, sum);
return ret;
Run Code Online (Sandbox Code Playgroud)

}

nem*_*equ 7

是的,您可以使用SIMD Everywhere (SIMDe)。它提供了许多内在函数的可移植实现,包括代码中的所有内在函数。全面披露:我是首席开发人员。

编辑:在这里回复 phuclv 因为评论有点长。

SIMDe 目前并不像我们经常为 NEON、AltiVec/VSX、WASM SIMD 等所做的那样使用c6x 内在函数来实现功能。没有什么可以阻止它,并且非常欢迎补丁,但它们还没有出现。

然而,SiMDe 中的每个函数都有回退到标准 C 的后备实现。不过,通常事情不会发展到那么远;即使不考虑上面提到的特定于体系结构的实现,如果编译器支持它,操作也可以使用 GNU C矢量扩展来实现,甚至可移植的后备实际上也用OpenMP SIMD指令进行注释。转换函数使用编译器内置__builtin_convertvector函数,例如 ,需要打乱数据的函数将使用__builtin_shuffle/ __builtin_shufflevector

基本上,SIMDe 会竭尽全力让编译器尽可能对向量进行向量化,即使 SIMDe 实际上并不知道如何执行此操作。上面的函数都非常简单;我对 c6x SIMD 的了解不够,无法了解硬件支持哪些类型的操作,但 GCC 和 clang(TI 编译器所基于的)通常可以很好地利用 SIMDe 提供的所有信息。老实说,我在这里最担心的是 c6x 是否支持 SIMD 中的双精度浮点(上面的代码使用)......它很有可能只支持单精度浮点。