簡體   English   中英

在CUDA中訪問struct成員?

[英]Accessing a struct member in CUDA?

為了簡化,請說我有這個結構:
someheader.h

typedef struct
{
    float x
}someStruct;

在Cuda中,如果結構由C ++應用程序共享,設備函數將如何訪問結構的成員?

例如:

__global__ void stuff( someStruct *g ) {
    g[0].x = 0.4f;
}

這是正確的方法嗎? 它似乎沒有工作。

Struct本身是一個抽象實體,在主機或設備端沒有物理表示。

設備端對象的內存布局與主機端的內存布局完全相同(如果這是您真正要求的),因此您可以安全地將大型struct對象從主機復制到設備,反之亦然。

訪問對象的成員只不過是在編譯時計算正確的偏移量並在運行時將其添加到對象指針( this )。 CUDA完全有能力做到這一點。

someStruct.x=2將在匯編語言中轉換為類似的東西:

mov [someStruct]+0, 2

其中0是結構中成員x的偏移量。

更新:

主機和設備內存是完全獨立的(一個在你的RAM中,另一個在你的GPU上)。 沒有什么是共享的,一切都必須來回發送(這可能非常耗時)。 使用CudaMemcpy函數復制數據。

您需要將結構數組傳輸到GPU。 例如,要訪問內核中的浮點數組,您需要執行以下操作

__global__ static void myKernel(float *val)
{
 val[0] = 0.4f;
}

int main()
{
...
cudaMemcpy(d_Val, h_Val, n * sizeof(float), cudaMemcpyHostToDevice);
...
}

這當然是基礎知識。 您可以使用任何數據類型替換float並獲得相同的行為。 結構只是用戶定義的數據類型。

這與發送單個float(因此是單個結構)不同,因為內核的所有輸入都在GPU可以訪問這些值的運行時(取決於卡)被推入GPU內存系統的某個部分。 因此,如果輸入是結構,則當內核嘗試訪問它時,整個結構駐留在GPU上。 但是,如果您發送指向主機上生成的結構的指針,則GPU具有指針值而不是實際數據。

暫無
暫無

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

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