在构造函数中,我在设备端填充数组。
但现在我想在数组上执行反向函数。
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 :(得分: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