簡體   English   中英

CUDA __host__ __device__變量

[英]CUDA __host__ __device__ variables

在CUDA中,函數類型限定符__device____host__可以一起使用,在這種情況下,將為主機和設備編譯函數。 這允許消除復制粘貼。 但是,沒有__host__ __device__變量這樣的東西。 我正在尋找一種優雅的方式來做這樣的事情:

__host__ __device__ const double common = 1.0;

__host__ __device__ void foo() {
    ... access common
}

__host__ __device__ void bar() {
    ... access common
}

我發現以下代碼符合並運行沒有錯誤。 (所有結果均在Ubuntu 14.04上獲得,CUDA 7.5和gcc 4.8.4作為主編譯器)

#include <iostream>

__device__ const double off = 1.0;

__host__ __device__ double sum(int a, int b) {
    return a + b + off;
}

int main() {
    double res = sum(1, 2);
    std::cout << res << std::endl;
    cudaDeviceReset();
    return 0;
}

$ nvcc main.cu -o main && ./main
4

事實上, nvcc --cuda main.cu將cu文件轉換為:

...
static const double off = (1.0);
# 5 "main.cu"
double sum(int a, int b) {
# 6 "main.cu"
return (a + b) + off;
# 7 "main.cu"
}
# 9 "main.cu"
int main() {
# 10 "main.cu"
double res = sum(1, 2);
# 11 "main.cu"
(((std::cout << res)) << (std::endl));
# 12 "main.cu"
cudaDeviceReset();
# 13 "main.cu"
return 0;
# 14 "main.cu"
}
...

但是,毫不奇怪,如果聲明變量off沒有const限定符( __device__ double off = 1.0 ),我得到以下輸出:

$ nvcc main.cu -o main && ./main
main.cu(7): warning: a __device__ variable "off" cannot be directly read in a host function

3

那么,回到最初的問題,我可以依賴於全局__device__ const變量的這種行為嗎? 如果沒有,還有其他選擇嗎?

UPD順便說一下,上面的行為不會在Windows上重現。

對於普通浮點或整數類型,僅將變量標記為全局范圍的const就足夠了:

const double common = 1.0;

然后它應該可用於任何后續函數,無論是host, __device__ host __host____device__ __host__還是__global__

這里的文檔支持這一點,但受到各種限制:

設'V'表示命名空間范圍變量或具有const限定類型且沒有執行空間注釋的類靜態成員變量(例如, __constant__ __shared__ __device____constant__ __shared__ __device____constant__ __shared__ )。 V被認為是主機代碼變量。

如果V在使用點之前使用常量表達式初始化,則V的值可以直接在設備代碼中使用,並且它具有以下類型之一:

  • 內置浮點類型,除非Microsoft編譯器用作主機編譯器,
  • 內置整體式。

設備源代碼不能包含對V的引用或取V的地址。

在其他情況下,一些可能的選擇是:

  1. 使用編譯器宏定義的常量:

     #define COMMON 1.0 
  2. 如果變量的選擇范圍是離散且有限的,則使用模板。

  3. 對於其他選項/案例,可能需要管理變量的顯式主機和設備副本,例如,在設備上使用__constant__內存,以及在主機上使用相應的副本。 訪問變量的__host__ __device__函數中的主機和設備路徑可以根據nvcc編譯器宏區分行為(例如#ifdef __CUDA_ARCH__ ...

暫無
暫無

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

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