簡體   English   中英

CUDA代碼中的模板用法

[英]Template usage in CUDA code

我試圖了解如何在這里使用模板:

template <uint32_t N_ATOMIC=32>
struct ParallelCounter {
public:
  uint32_t count[N_ATOMIC];

   // spread the counts across the counter
  __device__ __host__ void set(uint32_t x) {
    for(int i=0; i < N_ATOMIC; i++) count[i]=x/N_ATOMIC;

  } 

};



#ifndef SPREAD
#define SPREAD 32
#endif
__device__ ParallelCounter<SPREAD> myCounter;
__global__ void initCounter() {
  int tid = threadIdx.x + blockIdx.x * blockDim.x;

  if(tid == 0)
    myCounter.set(0);
}

到目前為止,我所看到的所有模板示例在上面第一行的<>中都有一些變量。 但是為什么我們這里有一個常量uint32_t N_ATOMIC = 32。 如果它是一個常數,模板將如何有用? 它針對特定類型是固定的。 我對嗎? 謝謝

這個問題與CUDA無關。

如果以這種方式定義模板,則意味着如果實例化該模板但未專門提供該參數,則它將默認為指示的值 您仍然可以使用其他值實例化模板,以獲得不同的行為。

只能將typename用作模板參數是不正確的。 int const也可以是模板參數。

這很有用,因為此參數可以在編譯時而不是運行時確定。 盡早確定有助於生成更優化的運行時代碼。

在您的特定情況下,必須在編譯時確定結構ParallelCounter的大小。 C ++不會接受類型,直到運行時才能確定大小。

如果您的代碼中未使用模板,則可能必須針對不同的SPREAD值編寫一系列struct ParallelCountervoid initCounter()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM