在构造函数中,我在设备端填充数组。

但是现在我想在数组上执行反向功能。

 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;

}


它仍然会打印我在构造函数中填写的值。这里有什么问题?我该如何解决?怎么了?

最佳答案

您的内核没有反转任何东西。他们只是在否定价值观,所以如果有什么改变的话,我会很惊讶。话虽如此,如果您在代码中添加了错误检查(有关如何最好地执行错误检查的信息,请参见this other SO post),那么您会发现在调用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;
}

07-24 09:45
查看更多