2013-02-21 27 views
0

是否可以動態確定每個塊的最大線程數?即向GPU請求該值並將其存儲在變量中的功能。謝謝你的幫助。在CUDA中動態確定最大線程數?


謝謝,我決定線程用下面的代碼的最大數量:

int dev = 0; 
cudaDeviceProp deviceProp; 
cudaGetDeviceProperties(&deviceProp, dev); 

unsigned int maxThreads = deviceProp.maxThreadsPerBlock; 

,並用這個號碼我計算我的內核模塊和線程這一行:

unsigned int blocksNum = 1+((mSize-1)/maxThreads); // mSize is the size of array 
unsigned int threadsNum = 1+((mSize-1)/blocksNum); 
dim3 dimGrid(blocksNum, 1, 1); 
dim3 dimBlock(threadsNum, 1, 1); 
... 
kernel<<<dimGrid,dimBlock>>>(); 

這種形式是否正確地調用內核?

Thansk爲您提供幫助。


好的,我使用的Nvidia的總和減少內核號碼6,和所使用的樣本代碼,其中確定線程和塊與下一個代碼:

unsigned int threadsNum = (mSize < maxThreads*2) ? nextPow2((mSize + 1)/ 2) : maxThreads; 
unsigned int blocksNum = (mSize + (threadsNum * 2 - 1))/(threadsNum * 2); 

該代碼可以使用我的陣列。

回答

1

是的,值(maxThreadsPerBlock)是cudaGetDeviceProperties返回的屬性之一。對於完整的工作示例,請查看deviceQuery sample

+0

但是,我們不能保證給定的內核將在'maxThreadsPerBlock'中返回的結果啓動,我假設這個問題隱含地想知道的。 – talonmies 2013-02-21 21:55:26

+1

是的。我自己並沒有明白這一點。例如,「內核」這個詞不會出現在問題的任何地方。而'cudaGetDeviceProperties' *就是*「向GPU請求價值並將其存儲在變量中的函數」,正是如此。但是,當然你是正確的,假設這些參數在'maxThreadsPerBlock'和其他相關參數中定義的限制內,並且假設沒有其他外部的內核抑制器,內核將會正確啓動啓動參數中指定的線程數發射。 – 2013-02-21 22:03:39

3

您可以使用驅動程序API來訪問特定內核的屬性(稱爲驅動程序API術語中的函數)。

使用API​​調用cuFuncGetAttribute,其中CUfunction_attribute的值等於CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK。

這給了你:

每個塊的線程,最大數量超過該推出的功能將失敗。該數字取決於函數當前加載的功能和設備。

0

你需要的是cudaFuncGetAttributes如果您使用CUDA運行時API或cuFuncGetAttribute與CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK爲RoBiK在他的回答中指出,如果你正在使用CUDA驅動程序API。這兩個函數都記錄在相應的API文檔的執行控制部分。