2013-11-29 46 views
1

我想實現我的內核的兩個版本,一個向量和一個標量版本。 現在我想知道是否讓double4類型在內存訪問方面類似於大小爲4的double的數組。
我想到的是對於我的兩個內核使用相同的數據類型,其中標量爲1我將像使用常規數組一樣單獨處理每個組件(.s0 .. .s3)。
在其他世界中,我只想在標量內核中使用OpenCl矢量類型進行存儲,並利用矢量內核中的矢量屬性。
我真的不想爲每個內核有不同的變量類型。
這對你們有意義嗎?
這裏有什麼提示嗎?
謝謝,OpenCl中的向量類型和一維數組

Éric。

回答

2

2,4,8和16個元素向量像2/4/8/16標量一樣排列在內存中。例外是3個元素向量,其使用與4個元素向量一樣多的內存。根據我的經驗,使用向量的主要好處是所有設備都支持某種形式的指令級並行性,可以通過CPU上的SIMD指令或通過同時執行獨立指令(這發生在GPU上)執行。

+0

謝謝你們,我現在對你的兩個回覆感到困惑。有人告訴我,NVIDIA GPU不能很好地使用矢量。所以我想有2個內核。我的k20的標量,以及我的Xeon Phi的矢量版本。那麼,在這裏我也困惑,因爲我得到'設備首選雙類型向量寬度:1'這個設備。 – Eric

+0

@Eric可以看看下面的內存訪問以及合併了一些修正我的評論。關於1首選載體寬度,讓說你添加兩個個float4在NVIDIA GPU,變成4次浮點加法,因爲有在NVIDIA GPU的指令集不向量指令。然而,這些增加了4可以以任何順序執行,從而允許將被提取一些ILP,這對於當前的開普勒代GPU的事項。 Xeon Phi已經獲得了矢量操作,所以它應該報告一個優先的矢量寬度大於1。 – chippies

1

關於內存訪問模式:

這首先取決於您的OpenCL內核編譯器:一個合理的編譯器將使用一個單一的存儲器事務來獲取在單個工作項使用多個陣列單元中的數據,甚至在多個項目中使用多個單元格。在NVidia GPU上,全局設備內存以128字節爲單位進行讀取,這使得每次讀取時合併多達32個浮點值是值得的;看到

NVidia CUDA Best Pracices Guide: Coalesced Access to Global Memory

因此,使用float4甚至可能沒有足夠最大化您的帶寬利用率。

關於在內核中使用向量類型:

我相信這些將是有益的大部分,如果不是唯一的,與向量指令的CPU,而不是GPU的 - 在工作項目本質上是標量;矢量化在多個工作項目上。

+1

128字節中描述= 4個* 32個字節= 4個32位浮點,不8.又,AMD的GPU所使用VLIW益處從矢量化代碼。 Nvidia GPU具有一些指令級並行性 - 可以同時調度獨立的指令。您可以在不使用矢量操作的情況下利用此功能,但使用矢量操作更容易。 – chippies

+0

@chippies:是的,編輯答案。但是,128字節= 32 * 4字節= 32 4字節浮點數= 32 32位浮點數。那麼,32個IIANM。 – einpoklum

+0

對不起,我在考慮128位(非字節)內存訪問指令。也有32位和64位訪問,所以從內存帶寬方面來說,float2或float4對浮點數沒有任何好處。我忘了,全球內存實際發生的交易是128字節傳輸,但這是每一個經線交易這就是爲什麼凝聚的內存訪問事。 – chippies

1

不知道如果我得到您的問題。我會嘗試一些一般提示&技巧。

你沒有私有內存中的數組,所以這裏的矢量可以派上用場。正如其他人所描述的那樣,內存對齊是可比的。有關信息,請參閱http://streamcomputing.eu/blog/2013-11-30/basic-concepts-malloc-kernel/

您缺少的選項是使用結構。閱讀Arranging memory for OpenCL的第一個答案的第二部分以瞭解更多信息。

另一件事,可能是方便:

__attribute__((vec_type_hint(vectortype))) 

英特爾有多種解釋:http://software.intel.com/sites/products/documentation/ioclsdk/2013XE/OG/Writing_Kernels_to_Directly_Target_the_Intel_Architecture_Processors.htm

這是很棘手的一個寫多個內核。可以使用宏技巧如http://streamcomputing.eu/blog/2013-10-17/writing-opencl-code-single-double-precision/