2013-09-29 76 views
0

我無法確定如何處理大小小於全局大小在clEnqueueNDRangeKernel中設置的數組。在OepnCl中不適合全局大小的數組

在我的原子計算中,全局大小由原子數設置。這是位置,速度和力量的大小。然後,我做一個僞歸約,並將數據存儲在大小與數量相對應的數組中。我也有一個小陣列來存儲這對配對的參數。

我對該職位沒有任何問題,我宣佈他們爲__global const double4 *positions。我的問題是關於另外兩種。根據我的理解,一個線程與每個數組元素相關聯,但這不是我想要的小陣列。要我去最好的辦法是通過參數數組作爲__const__private,但我不知道我可以傳遞一個數組作爲__private(像我這樣做與標量),並將其設置爲__const產生錯誤:

:149:80: error: invalid address space for pointee of pointer argument to __kernel function 
         __global float2 *atom_type,__global const double *atmmass, __const double8 *two_body_type, 

關於我的reduce數組,現在我通過它作爲__global輸出只是垃圾。當我聲明它爲__const時,我得到與上面相同的錯誤,無論如何,我想這將是一個問題,以後找回數據。

你們會怎麼做?

+0

上面提到的錯誤已解決。我的錯誤是使用'__const'而不是'__constant'。 – Eric

回答

1

輸入或輸出數組與內核執行的全局大小之間的關係不是由OpenCL固定或定義的,它完全取決於您的內核。

如果你想所有工作項目與較大的陣列工作,然後只一些較小陣列的工作,你可以代碼。只要檢查global_id是否在較小數組的範圍內。

如果在數組大小之間存在某種固定關係(如3到1),則可以改爲處理大數組元素,併爲每個工作項目處理一個小數組元素,並使用全局大小的三分之一。

+0

因此,'clEnqueueNDRangeKernel'中設置的'global_work_size'值就是我們想要使用的線程數,但實際上我們可以有更小或更大的數組。是對的嗎? – Eric

+0

沒錯。全球規模是說「我需要這麼多工作項目」,每個工作項目都使用global_id(0)來了解要做什麼。數組可以大於或小於全局大小。例如,如果要從一個數組讀取4個項目,然後僅爲奇數編號的工作項目將其總和寫入輸出數組,則輸入數組將爲全局大小的4倍,並且輸出數組爲半個全球大小的大小。這取決於你希望你的內核做什麼。 – Dithermaster

+0

太好了,謝謝。這使事情更清楚。 – Eric