inline void addition(double * x, const double * vx,uint32_t size){
/*for (uint32_t i=0;i<size;++i){
x[i] = x[i] + vx[i];
}*/
__asm__ __volatile__ (
"1: \n\t"
"vmovupd -32(%0), %%ymm1\n\t"
"vmovupd (%0), %%ymm0\n\t"
"vaddpd -32(%1), %%ymm0, %%ymm0\n\t"
"vaddpd (%1), %%ymm1, %%ymm1\n\t"
"vmovupd %%ymm0, -32(%0)\n\t"
"vmovupd %%ymm1, (%0)\n\t"
"addq $128, %0\n\t"
"addq $128, %1\n\t"
"addl $-8, %2\n\t"
"jne 1b"
:
: "r" (x),"r"(vx),"r"(size)
: "ymm0", "ymm1"
);
}
我現在正在練習彙編(AVX指令),所以我在內聯彙編中編寫了上面這段代碼,以替換原函數中的c代碼(已註釋掉)。編譯過程是成功的,但是當我嘗試運行該程序時,出現錯誤:Bus error: 10
對此錯誤的任何想法?我不知道這裏有什麼問題。編譯器版本是clang 602.0.53。謝謝!如何更新矢量化程序集(AVX)中的數組?
也許你可以問問*鐺*生成(從C代碼)爲您彙編代碼,並與您的版本進行比較? –
@ringø除了一些標籤不同且寄存器被指定外,它幾乎是一樣的。 – PLNewbie
你的問題不是關於C,而是彙編。 – Olaf