为什么反转此功能不起作用

时间:2013-05-16 00:06:35

标签: c++ cuda

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

但现在我想在数组上执行反向函数。

 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;

}

它仍会打印我在构造函数中填充的值。这里有什么问题?我怎么解决呢?出了什么问题?

1 个答案:

答案 0 :(得分:1)

你的内核没有扭转任何东西。他们只是否定了价值观,所以如果你看到任何事情发生逆转,我会感到非常惊讶。话虽如此,如果您在代码中添加错误检查(请参阅this other SO post了解如何最好地执行错误检查),那么您将看到代码在cudaMalloc的{​​{1}}调用中失败{1}}功能。您可以通过将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