首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C6678 DSP上使用SSE指令集?

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

Stack Overflow用户
提问于 2022-02-21 12:28:57
回答 3查看 176关注 0票数 3

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

是否可以将SSE指令修改为普通的C++指令?如何修改?期待您的回复。示例:

代码语言:javascript
运行
复制
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;

}

EN

回答 3

Stack Overflow用户

发布于 2022-02-21 15:28:26

是的,您可以使用SIMD随处可见 (SIMDe)。它提供了许多本质的可移植实现,包括代码中的所有内部实现。完全披露:我是首席开发人员。

编辑:回复phuclv在这里,因为这是一个很长的评论。

SIMDe目前并没有像我们通常对NEON、AltiVec/VSX、WASM等那样使用c6x仪器来实现函数。没有什么能阻止它,补丁非常受欢迎,但它们还没有出现。

但是,SiMDe中的每个函数都有回到标准C的回退实现,通常情况不会太远;即使不考虑上面提到的特定于体系结构的实现,如果编译器支持它,操作也是使用GNU 向量扩张实现的,甚至可移植的回退实际上也会用OpenMP SIMD指令进行注释。转换函数使用编译器内置(如__builtin_convertvector ),而需要对周围数据进行洗牌的函数将使用__builtin_shuffle / __builtin_shufflevector

基本上,SIMDe竭尽全力让编译器尽可能地矢量化,即使SIMDe实际上不知道如何实现。上面的函数都非常简单;我对c6x SIMD还不太了解,不知道硬件中支持哪种操作,但是GCC和clang ( TI编译器所基于的)通常对SIMDe提供的所有信息做得很好。老实说,我最担心的是c6x是否支持SIMD中的双精度浮点(上面的代码使用).很有可能它只支持单精度浮标。

票数 7
EN

Stack Overflow用户

发布于 2022-02-21 15:32:50

是否可以将SSE指令修改为普通的C++指令?

没有所谓的"C++指令“,因为C++是一种高级语言,只有语句和指令。但是,是的,可以将SSE转换为C++表达式,因为它们只是多个并行操作

SSE是SIMD指令集之一,因此只需在目标体系结构中将其转换为相应的SIMD。在你的例子中,TI C6678确实支持SIMD。

C64x+和C674x DSP支持16位数据的双向SIMD操作和8位数据的4路SIMD操作.在SIMD上,通过扩展C66x指令的宽度来提高矢量处理能力。C66x DSP可以执行在128位向量上操作的指令.

票数 2
EN

Stack Overflow用户

发布于 2022-02-21 16:24:00

C66x体系结构确实支持许多SIMD指令,有点类似于英特尔的SSE指令。

您需要了解两种体系结构中处理器的寄存器集,并比较可用的指令。

例如,_mm_add_ps执行四个同时添加的单精度浮点数,在SSE寄存器中包含四个四个。DSP有一个类似的DADDSP指令,只执行两个这样的加法。因此,您需要将一个_mm_add_ps转换为两个DADDSP

阅读手册(这些指令集是在线的),了解指令在做什么,并找到相应的内容。在出现死胡同的情况下,您仍然可以使用好的旧标量操作,如C[0]= A[0]+B[0]; C[1]= A[1]+B[1];

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71206316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档