2011-03-10 49 views
1

如何在'print'函數中訪問'do_sth'函數(查看代碼)?爲什麼在沒有使用cudaMemcpy的情況下,GPU可以看到'N'(查看代碼)variable/constant?從全局函數中調用設備函數

__device__ void do_sth(char *a, int N) 
{ 
     int idx = blockIdx.x * blockDim.x + threadIdx.x; 
     if(idx < N) 
     {  
       a[idx] = a[idx]; 
     } 
} 


__global__ void print(char *a, int N) 
{  
     //question_1: why there is an access to N, it is now in GPU memory, how? 
     int idx = blockIdx.x * blockDim.x + threadIdx.x; 

     //do_sth<<<nblock2,blocksize2>>>(a,N); //error_1: a host function call can not be configured 
     //do_sth(&&a,N); //error_2: expected an expression 

     if(idx<N) 
     {  
       a[idx]=a[idx]; 
     } 
} 
+0

你的問題是模糊的,請詳細說明 – jwdmsd 2011-03-10 06:13:23

回答

6
  • __global__功能(又名 「內核」)駐留在GPU了。所有參數(變量aN)在呼叫時通過共享或常量內存(取決於您的設備類型),因此您可以直接訪問這些變量。參數大小的限制 - 費米前期卡上的參數大小爲256B,費米卡上的參數大小限制爲4KB,因此如果要傳輸大塊數據,則不能避免使用cudaMemcpy函數。

  • __global__函數參數不應該被修改。

  • 當調用從__global____device__指定三重括號中的配置參數。所有線程都會調用__device__函數。請注意,您可以從if語句中調用函數,以防止某些線程執行它。

  • 在當前版本的CUDA中,不可能在內核執行期間產生更多的線程。

  • 沒有一元&&運營商在CUDA C++(有在普通的C沒有這樣的運營商++,不知道現在在新的標準出現)

+1

根據編程指南在http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf計算2.x能力的設備得到4KB – 2012-03-27 14:25:01

+0

謝謝!修復。 – CygnusX1 2012-03-28 08:59:04