我嘗試使用行內匯編器進行 SIMD 乘法。但是,結果始終為零或(在其他情況下)獲得(對我而言)無法理解的值。
#include <stdio.h>
int main(void)
{
double x[2] = {2.0, 3.0};
double y[2] = {0.0, 0.0};
asm volatile (
"fmul %[y].2d, %[x].2d, %[x].2d\n"
: /* outputs */
[y] "=&w" (y)
: /* inputs */
[x] "w" (x)
: /* clobbers */
"cc"
);
printf("result = (%f, %f)\n",
y[0], y[1]);
return 0;
}
編譯
aarch64-linux-gnu-gcc -mcpu=cortex-a73 -march='armv8-a'
我總是得到輸出
result = (0.000000, 0.000000)
但我希望(4.0、9.0)。請幫忙!
uj5u.com熱心網友回復:
正如 Jester 所說,您必須將值傳遞給asm陳述句,而不是指向相關資料的指標。此值的正確型別是float64x2_tfrom arm_neon.h。所以進行如下操作:
#include <stdio.h>
#include <arm_neon.h>
int main(void)
{
double x[2] = {2.0, 3.0};
double y[2] = {0.0, 0.0};
asm volatile (
"fmul %[y].2d, %[x].2d, %[x].2d\n"
: /* outputs */
[y] "=&w" (*(float64x2_t *)y)
: /* inputs */
[x] "w" (*(float64x2_t *)x)
: /* clobbers */
"cc"
);
printf("result = (%f, %f)\n",
y[0], y[1]);
return 0;
}
請注意,當您包含內在函式標頭時,您不妨直接使用內在函式:
int bar(void)
{
double x[2] = {2.0, 3.0};
double y[2] = {0.0, 0.0};
float64x2_t *xx = x, *yy = y;
*yy = vmulq_f64(*xx, *xx);
printf("result = (%f, %f)\n",
y[0], y[1]);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/477889.html
上一篇:在pyspark中拆分對應的列值
