將浮點數相乘和相加 [英] Multiplying and adding float numbers

查看:0
本文介紹了將浮點數相乘和相加的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一項任務是將一些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屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放