2016-03-16 50 views
0

我有一個float8向量類型,我使用矢量分量尋址乘以矢量分量,如下所示(注意下面的變量v實際上不是一個常量);有效乘以OpenCL矢量組件?

float8 v = (float8) (1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); 
float result = v.s0 * v.s1 * v.s2 * v.s3 * v.s4 * v.s5 * v.s6 * v.s7; 

但是,這可以防止我的內核在使用英特爾代碼構建器編譯時被矢量化。

Device build started 
Device build done 
Kernel <test> was not vectorized 

要通過這個來,我開始創建載體的拷貝,掩蔽所需要的組件,並將它們都試圖調用點功能,然而,這一切似乎都相當低效和曲折前乘在一起。

因此,我的問題是,我怎樣才能將我的矢量的組件在一個高效的矢量化莊園中相乘?

+0

如果你只做一個8比1的產品,那麼很難矢量化。然而,如果你想要128比1或更大,那麼將矢量劃分爲16個矢量-8和16矢量-8產品是有意義的,然後將8輸入爲1. – user3528438

+0

對不起,我不確定你的意思是8如果這就是你的意思,我想乘以float8矢量的每個組件來獲得一個浮點數。 – Vivilar

回答

1

我的評論有錯誤,因爲它不是你需要在結果中的點積。它只是8個數字的乘法。並行工作數據應該平行,而不是在同一個容器中。如果你想乘S0 S1,S2,... S7然後你把他們在連續矢量變量

variable-1: s0 p0 r0 q0 .... z0 
variable-2: s1 p1 r1 q1 .... z1 

variable-8: s7 p7 ....  z7 

可以使用的float8類型乘以那些SIMD速度,並有一次對8個乘法和繼續多次您需要,而不僅僅是8個。

在每次乘法中,您都有責任檢查錯誤和溢出。但是,當硬件在單個指令中進行8次乘法運算時,您需要哪種順序?你希望它們以增加的索引順序(串行,緩慢)或類似於樹元素上的成對乘法(乘法更少,更快,但給出不同結果)乘以?有時候操作順序可能很重要。

如果是gpu,只需乘以gpu的指令級並行度+超線程引擎即可達到效率。 如果是cpu,你應該首先檢查你的cpu是否支持垂直乘法指令(我懷疑是否存在這樣的東西),如果不是這樣的話你需要乘以而不是向量元素。這應該更容易矢量化,因爲它是主存儲器上的連續數據,因爲CPU不會對本地內存進行顯式控制。

+0

是的,我同意這一點,通過創建原始矢量的副本並在垂直莊園中屏蔽/輸出所需組件來開始做。我雖然這將是矯枉過正,但我​​需要衡量一下。也許有更簡單的方法將我的行向量切換到列向量,以便我可以並行地乘以所有的值? – Vivilar

+0

如果只有8個數字,只需逐個乘。如果有成千上萬個這樣的向量需要垂直乘法,那麼您應該創建8個向量,它們是數千個元素並將它們並行(水平)相乘。 –

+0

哦,我落在同一個陷阱a + b + c + d ...不是他想要的,而是a * b * c * d ... – DarkZeros