2013-05-16 37 views
0

在構造函數中,我在設備端填充數組。爲什麼反轉此功能不起作用

但現在我想對陣列執行反轉功能。

using namespace std; 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 


__global__ void generateVector(int *data,int count){ 
    int tid = blockIdx.x; 
    data[tid] = -tid; 
} 

__global__ void reverseArray(int *data,int count){ 
    int tid = blockIdx.x; 
    data[tid] = tid; 
} 

class FData{ 
private: 
    int *data; 
    int size; 
public: 
    FData(int sizeP){ 
     size = sizeP; 
     data = new int[size]; 
     int *devA; 

     cudaMalloc((void**) &devA, size * sizeof(int)); 
     generateVector<<<size,1>>>(devA,size); 
     cudaMemcpy(data,devA, size * sizeof(int),cudaMemcpyDeviceToHost); 

     cudaFree(devA); 
    } 

    ~FData(){ 
     delete [] data; 
    } 

    int getSize(){ 
     return size; 
    } 



    int elementAt(int i){ 
     return data[i]; 
    } 

    void reverse(){ 
     int *devA; 
     cudaMalloc((void**) &devA, sizeof(int)); 
     reverseArray<<<size,1>>>(devA,size); 
     cudaMemcpy(data,devA,size * sizeof(int),cudaMemcpyDeviceToHost); 
     cudaFree(devA); 

    } 


}; 


int main(void) { 

    FData arr(30); 

    cout << arr.elementAt(1); 


    arr.reverse(); 
    cout << arr.elementAt(1); 


    return 0; 

} 

它仍然打印我在構造函數中填充的值。這裏有什麼問題?我如何解決它?出了什麼問題?

+0

也許它工作正常,什麼是之前的元素和 – greedybuddha

+0

後它無關,但你有內存泄漏(你需要在析構函數中調用'刪除[]'您'data'成員變量)。你還需要釋放你所有的CUDA內存,你不是在做 – alrikai

+0

嘗試一些cuda錯誤檢查? –

回答

1

你的內核沒有反轉任何東西。他們只是否定價值觀,所以如果有什麼我會很驚訝,如果你看到任何逆轉。這樣說的話,如果你在你的代碼中添加錯誤檢查(參見this other SO post關於如何最好地進行錯誤檢查),那麼你會看到你的代碼將在reverse函數中調用cudaMalloc時失敗。你可以通過修改devA作爲一個簡單的指針來解決這個問題(無論如何,你不需要將它作爲主機數組來分配,因爲你並沒有在主機上使用它)。

void reverse(){ 
    int *devA; 
    cudaMalloc((void**) &devA, size * sizeof(int));  
    reverseArray<<<size,1>>>(devA,size); 
    cudaMemcpy(data,devA,size * sizeof(int), cudaMemcpyDeviceToHost); 
    cudaFree(devA); 
} 

此外,你也應該釋放你的內存,你有主機端和設備端內存泄漏。每當你有一個cudaMalloc電話,你應該有一個相應的cudaFree。另外,考慮添加一個析構函數以釋放您的主機端data成員,因爲您也有內存泄漏。

~FData() 
{ 
    delete [] data; 
} 
+0

我做了所有你想要它仍然不工作 – asdasd

+0

它適合我,也許嘗試發佈您的更新代碼,我可以看看 – alrikai

+0

我更新請看看它 – asdasd