2016-08-01 54 views
0

我目前正在通過pycuda/cuda在GPU上編程一些數值方法,並正在編寫我自己的內核。在某些時候,我需要估計至少1000個耦合ODE的誤差。我不想複製超過1000個條目的幾個向量,所以我創建了一個基本的最大功能的內核(在帖子的底部)。這些%(T)s和%(N)s是我在運行時所做的字符串替換,這對於這個問題應該是不相關的(T代表複雜的數據類型,N代表耦合的ODE的數量)。沒有線程的GPU內核塊大小/網格大小

我的問題是:沒有必要進行並行計算,所以我不使用線程。當我在python中調用這個函數時,我應該指定什麼是塊大小或網格大小?

 __global__ void get_error(double *max_error,%(T)s error_vec[1][%(N)s]) 
    { 
     max_error[0]=error_vec[0][0].real(); 
     for(int ii=0;ii<%(N)s;ii=ii+1) 
     { 
      if(max_error[0] < error_vec[0][ii].real()) 
      { 
       max_error[0]=error_vec[0][ii].real(); 
      } 
     } 
     return; 
    } 
+2

1的塊大小和1的網格大小會讓你正好在GPU上執行一個線程 –

+0

@RobertCrovella謝謝,即使我沒有任何變量鏈接到threadId,gpu將使用一個線程執行? – malxmusician212

+1

正確。相信你的知識(不管它可能是什麼)作爲C/C++程序員。 –

回答

1

在內核啓動時,將在GPU上啓動的線程總數等於爲啓動指定的網格大小和塊大小的乘積。

這兩個值都必須是正整數,因此這兩個值的唯一可能組合是1,1來創建單個線程的啓動。

CUDA內核不需要對內建變量進行任何特定引用(例如blockIdx,threadIdx等),但通常這樣做是爲了區分線程間的行爲。在只有一個線程被啓動的情況下,沒有特別的理由使用這些變量,並且沒有必要這樣做。

只有一個線程的CUDA內核啓動不是完成工作的高性能方法,但可能存在特定情況,方便這樣做並且不會對整個應用程序產生顯着的性能影響。

對於我而言,你提出的內核爲什麼不能作爲線程並行內核來重構(它似乎在執行max-finding reduction),但這似乎與你的問題是分開的。

+0

您究竟能夠平行找到最大值? – malxmusician212

+0

基本算法被稱爲並行壓縮,並且[已有文檔記載](http://developer.download.nvidia.com/assets/cuda/files/reduction.pdf)。爲了說明的目的,大多數處理假定還原操作是所有元素的總和,但找到所有元素的最大值(或所有元素的最小值)的過程僅僅是微不足道的。 [這裏](http://stackoverflow.com/questions/25195874/cuda-using-grid-strided-loop-with-reduction-in-shared-memory)是一個討論最大發現減少的'cuda'標記問題。 –

+0

真棒,非常感謝@RobertCrovella! – malxmusician212