2013-10-04 54 views
0

在書中CUDA按示例頁面上沒有26也撰文指出:使用cudaMalloc()分配的內存是否可以由主機訪問?

你可以通過與cudaMalloc分配的指針()到 在主機上執行的功能。

您不能使用分配給cudaMalloc()的指針從主機上執行的代碼中讀取或寫入 內存。

爲了證明第一個概念我在這裏寫代碼:

main() 
{ 
int * ad, N; 

cudaMalloc((void **)&ad, Sizeof(int) *N); 

GPUFunction<<<...>>>(ad); 
Hostfunction(ad); 

} 


Hostfunction(int * AD) 

{ 

int c ; 

c=AD[N-1]; 

printf("%d", c); 

} 


    __global__ void GPUFunction(int *AD) 

{ 

AD[threadIdx.x]= threadidx.x; 
} 

這是什麼點#1以上解釋?如果是這樣,與上面#2相反,正如你可以看到主機功能正在讀取內存廣告。那麼我的理解出錯了?

回答

2

這兩點並不矛盾。

第一點只是意味着你可以通過AD指針HostFunction正是因爲你正在做的,但這並不意味着你可以direcly通過

c=AD[N-1]; 

訪問設備內存的第二點是告訴你。

您可以執行的操作是使用指針來執行其他cudaMemcpy操作,或將該指針傳遞給__global__函數。

所以,一個可能的HostFunction可能是

__global__ void GPUFunction(int *AD) 
{ 
    AD[threadIdx.x]= threadidx.x; 
} 

Hostfunction(int * AD) 
{ 
    GPUFunction<<<...,...>>>(AD); 
} 
+0

+10,這對我來說很有意義。謝謝 – user25108

2

無法看到主機功能是讀取內存ad。你當然寫了一些代碼,試圖做到這一點,但它是無效的代碼,它會分段錯誤。

由於您在此處提供的代碼不完整或不可編譯,因此不會顯示任何內容。

這裏有一個編譯例子非常接近你所鍵入的,這表明你的Hostfunction不會正確地傳遞ad當工作:

$ cat t251.cu 
#include <stdio.h> 

    __global__ void GPUFunction(int *AD) 

{ 

AD[threadIdx.x]= threadIdx.x; 
} 

void Hostfunction(int * AD, int N) 

{ 

int c ; 

printf("preparing to read ad in host code\n"); 
c=AD[N-1]; 

printf("%d", c); 

} 

int main() 
{ 
int * ad, N; 
N = 1; 
cudaMalloc((void **)&ad, sizeof(int) *N); 

GPUFunction<<<1,1>>>(ad); 
Hostfunction(ad, N); 

} 


$ nvcc -arch=sm_20 -o t251 t251.cu 
$ ./t251 
preparing to read ad in host code 
Segmentation fault (core dumped) 
$ 
相關問題