2013-05-22 80 views
0

我正在使用CUDA優化一些代碼。我不知道我是否應該使用裏面cudaMalloc _全球_功能(FUN1)否(不是X已分配基於GPU的內存?):CUDA(嵌套?)內存分配

__global__ void fun2(double *y) 
{ 
    int i=blockIdx.x; 
    y[i]=...; 
} 

__global__ void fun1(double *x) 
{ 
    //should I cudaMalloc() y for fun2 or just use the x which was already allocated in main? 
    fun2<<<N,1>(x); 
    ... 
} 

int main(){ 
    double *x; 
    ... 
    cudaMalloc((void**)&x, N*sizeof(double)); 
    fun1<<<N,1>>>(x); 
    ... 
} 
+0

不能調用cudaMalloc設備代碼。而且我不確定你是否可以在另一個全局函數中調用全局函數。你只能擁有3.5代GPU。 –

+0

所以我不能優化包含其他功能的功能嗎? –

+0

描述你的問題,請 –

回答

1

可能是你的意思是這樣:

__device__ void fun2(double *y) 
    { 
     int i=blockIdx.x; 
     y[i]=...; 
} 

__global__ void fun1(double *x) 
{ 

    fun2(x); 
    ... 
} 

int main(){ 
    double *x; 
    ... 
    cudaMalloc((void**)&x, N*sizeof(double)); 
    fun1<<<N,1>>>(x); 
    ... 
} 

但它是常見的計算的threadId全球功能

+0

YES這似乎是合法的!我還不清楚的是,當調用fun2(來自fun1)時,編譯器如何知道該數組有多大?爲了澄清,fun2實際上是一個CUDA優化的for-loop。如果它是一個全局函數,那麼可以使用'fun2 << >>(x)'來說明數組的大小。 –

+0

__global__函數在GPU上運行。你用cudaMalloc((void **)&x,N * sizeof(double))分配內存。您應該撥打fun2 <<<1,SIZE> >>代替 –

+0

是的;但是在你的代碼中fun2會被調用多少次?它應該被稱爲SIZE-times(數組大小)。確切地說,是 –