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;
}
uj5u.com熱心網友回復:
是的,您可以使用SIMD Everywhere (SIMDe)。它提供了許多內在函式的可移植實作,包括代碼中的所有內在函式。全面披露:我是首席開發人員。
編輯:在這里回復 phuci ,因為評論有點長。
SIMDe 目前不使用 c6x 內部函式來實作我們經常為 NEON、AltiVec/VSX、WASM SIMD 等執行的功能。沒有什么可以阻止它,并且非常歡迎補丁,但它們還沒有。
然而,SiMDe 中的每個函式都有回退到標準 C 的回退實作。不過,通常事情不會那么遠。即使不考慮上面提到的特定于體系結構的實作,如果編譯器支持它,操作也可以使用向量擴展來實作,甚至可移植的后備實際上也使用OpenMP SIMD指令進行了注釋。轉換函式使用編譯器內置__builtin_convertvector函式,如 ,而需要混洗資料的函式將使用__builtin_shuffle/ __builtin_shufflevector。
基本上,SIMDe 竭盡全力讓編譯器盡可能地向量化,即使 SIMDe 實際上并不知道如何去做。上面的函式都很簡單;我對 c6x SIMD 的了解不夠多,無法知道硬體支持哪種操作,但是 GCC 和 clang(TI 編譯器所基于的)通常可以很好地處理 SIMDe 提供的所有資訊。老實說,我在這里最擔心的是 c6x 是否支持 SIMD 中的雙精度浮點(上面的代碼使用)......很有可能它只支持單精度浮點數。
uj5u.com熱心網友回復:
是否可以將 SSE 指令修改為普通的 C 指令?
沒有“C 指令”之類的東西,因為 C 是一種只有陳述句而沒有指令的高級語言。但是是的,可以將 SSE 內在函式轉換為 C 運算式,因為它們只是并行的多個操作
SSE 是SIMD指令集之一,因此只需將其轉換為目標架構中相應的 SIMD。在您的情況下,TI C6678 確實支持 SIMD:
C64x 和 C674x DSP 支持 16 位資料的 2 路 SIMD 操作和 8 位資料的 4 路 SIMD 操作。在 C66x DSP 上,通過擴展 SIMD 指令的寬度來提高矢量處理能力。C66x DSP 可以執行對 128 位向量進行操作的指令。
uj5u.com熱心網友回復:
C66x 架構確實支持許多 SIMD 指令,在某種程度上可以與 Intel 的 SSE 相媲美。
您需要了解兩種架構中處理器的暫存器集,并比較可用的指令。
例如,_mm_add_ps執行四次單精度浮點數的同時加法,在 SSE 暫存器中包含四乘四。DSP 有一個類似的DADDSP指令,它只執行兩個這樣的加法。因此,您將需要一個_mm_add_ps兩個翻譯DADDSP。
閱讀手冊(這些指令集在線),了解指令的作用,并找到等效項。在死胡同的情況下,您仍然可以求助于良好的舊標量操作,例如C[0]= A[0] B[0]; C[1]= A[1] B[1];
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430119.html
上一篇:陣列k個可能元素的最大連續和
