將浮點數相乘和相加 [英] Multiplying and adding float numbers
問題描述
我有一項任務是將一些C++代碼轉換為ASM,我想知道我的想法是否有意義。首先,我會將整數轉換為浮點數。我想得到數組數據到SSE寄存器,但這里有問題,因為我只想要3而不是4個整數,有什么方法可以克服這個問題嗎?然后,我將使用CVTDQ2PS將這些整數轉換為浮點數,并將這些數字保存在內存中。對于像0.393這樣的常量數字,我會做3個浮點數的矢量,然后我會做同樣的操作三次,所以我只考慮sepiaRed。為此,我會將轉換后的整數放入SSE寄存器,然后將這些數字相乘,這將得到xmm0寄存器中的結果?,F在如何將它們相加?
我想我的兩個問題是:如何將3個項從數組獲取到SSE寄存器,這樣我就可以避免任何問題。然后如何將xmm0寄存器中的三個數字相加在一起。
tmpGreen = (float)pixels[i + 1];
tmpRed = (float)pixels[i + 2];
tmpBlue = (float)pixels[i];
sepiaRed = (int)(0.393 * tmpRed + 0.769 * tmpGreen + 0.189 * tmpBlue); //red
sepiaGreen = (int)(0.349 * tmpRed + 0.686 * tmpGreen + 0.168 * tmpBlue); //green
sepiaBlue = (int)(0.272 * tmpRed + 0.534 * tmpGreen + 0.131 * tmpBlue); //blue
推薦答案
您不能輕松地將3個數字水平相加;Fastest way to do horizontal SSE vector sum (or other reduction)
您可以高效地并行映射4個像素,并帶有4個紅色、4個綠色和4個藍色的矢量。(您可能希望從平面的、而不是交錯的像素數據中加載。數組的結構,而不是結構的數組。)如果您只使用movdqu
加載4個int,并對cvtdq2ps
之后的高元素使用乘數0.0
,則一次處理單個像素可能會獲得一些好處。然后你可以做一個正常的4個元素的水平和,而不是必須調整它。(嗯,盡管做3會讓你在第一次加的同時進行第二次洗牌,而不是在之后。)
低效使用SIMD會失去一些好處;請參閱https://stackoverflow.com/tags/sse/info特別是https://deplinenoise.wordpress.com/2015/03/06/slides-simd-at-insomniac-games-gdc-2015/Re中的指南:人們如何經常嘗試使用一個SIMD矢量來容納一個x,y,z幾何矢量,然后發現SIMD沒有太大幫助。
這篇關于將浮點數相乘和相加的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!