2015-06-18 63 views
0

我是新GPU的發展,我想知道有多少工人(線程),併發執行我的內核,所以我用下面的內核OpenCL的工人數始終爲1

kernel void helloWorld(global int* result) 
{  
     int gid = 0; 
     gid = get_local_id(0); 
     if (gid > result[0]) 
     { 
     result[0] = gid; 
     } 
} 

但酷睿i7英特爾的結果運行時[0]始終爲0;並且在nvidia GPU上運行時,它始終爲0

+2

'我想知道同時有多少工人(線程)......什麼?!當你啓動內核時,這個數字是由* you *選擇的! –

+0

通過爲本地工作組大小指定NULL,可以將其留給運行時間。然而,這段代碼並不正確,因爲對'result [0]'的訪問不是原子的。所有線程都將讀取初始值(如果在運行內核之前清除緩衝區,則大概爲0),然後寫入它們的值,這會導致競爭狀態。相反,讓每個工作項將其本地ID寫入由其全局ID索引的緩衝區位置。結果會因設備而異。 – Dithermaster

回答

0

Opencl將設備上的線程劃分爲工作組。 一個工作組在同一個執行單元中被解決(注意幾個工作組可以在執行單元上) 可以讓編譯器決定工作組的大小。

但是,在啓動內核時選擇了多個總線程數。 例如:

clEnqueueNDRangeKernel(command_queue, cl_exec, 1, NULL, &tasksize, &local_size_in, 0, NULL, NULL) 

tasksize =線程總數 local_size =一組中的線程的數目

所以tasksize/local_size是工作組,你將有數量。

如果您編寫NULL而不是local_size,編譯器會決定工作組的大小。

local_size有幾個限制。 看看這裏:cl api

根據我的經驗,最佳結果大多是編譯器選擇的結果。 在複雜的情況下,您可能會有所不同,在這些情況下,您具有特定的知識,在運行時會發生什麼,這在編譯時不可用。

此外,所有設備都具有最大工作組大小。

CL_DEVICE_MAX_WORK_GROUP_SIZE