在构造函数中,我在设备端填充数组。
但是现在我想在数组上执行反向功能。
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;
}