0

In the constructor I fill the array on the device side.

but now I want to execute reverse function on the array.

 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;

}

It still prints the values which I filled in the constructor. What is the problem here? How can i solve it? What is going wrong?

4

1 回答 1

1

你的内核没有反转任何东西。他们只是在否定价值观,所以如果你看到任何东西被逆转,我会非常惊讶。话虽如此,如果您在代码中添加错误检查(请参阅有关如何最好地进行错误检查的其他 SO 帖子),那么您将看到您的代码在调用函数时将cudaMalloc失败reverse。您可以通过更改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;
}
于 2013-05-16T01:23:52.677 回答