我已实现此CuArray
以通过实现属性Rows
和Columns
来简化数组使用:
#include <cuda_runtime_api.h>
#include <cuda.h>
template<class TType>
class CuArray
{
public:
int Rows;
int Columns;
int Elements;
TType *ArrayPointer;
CuArray<TType>(int rows, int columns = 1)
{
this->Rows = rows;
this->Columns = columns;
Elements = this->Rows * this->Columns;
cudaMalloc(&this->ArrayPointer, sizeof(TType)*this->Elements);
}
static CuArray<TType>* GpuCreate(int rows, int columns = 1)
{
CuArray<TType>* cuArray = new CuArray<TType>(rows, columns);
CuArray<TType>* gpuCuArray;
size_t size = sizeof(CuArray<TType>);
cudaMalloc(&gpuCuArray, size);
cudaMemcpy(gpuCuArray, cuArray, size, cudaMemcpyHostToDevice);
return gpuCuArray;
}
};
然而,cudaMemcpy
似乎没有按预期工作,我不知道我做错了什么。
这是用于调用例如变量的变量的值(和指针位置)。 CuArray<int*>::GpuCreate(11);
:
使用Nsight Eclipse 7.5,Ubuntu 14.04 64位进行调试 cuArray = {0xb6e8b0,Rows = 11,Columns = 1,Elements = 11}
尺寸= 32
gpuCuArray = {0x7053e3600,Rows = 0,Columns = 0,Elements = 0}
new
和cudaMalloc
之后的指针值对我来说很合适,但cudaMemcpy
似乎不起作用。
那么我做错了什么?
答案 0 :(得分:1)
通常,以下代码应足以表示存储在GPU中的二维数组。您不需要将其Rows
,Columns
等存储在设备内存中。这些信息通常只需要主机方面。但如果不是您的情况,您可能需要描述有关您的设计考虑的更多详细信息。代码演示了如何使用CuArray
对象会更好。
#include <cuda_runtime_api.h>
#include <cuda.h>
template<class TType>
class CuArray
{
public:
int Rows;
int Columns;
int Elements;
TType *ArrayPointer;
CuArray<TType>(int rows, int columns = 1)
{
this->Rows = rows;
this->Columns = columns;
Elements = this->Rows * this->Columns;
cudaMalloc(&this->ArrayPointer, sizeof(TType)*this->Elements);
}
static CuArray<TType>* GpuCreate(int rows, int columns = 1)
{
CuArray<TType>* cuArray = new CuArray<TType>(rows, columns);
return cuArray;
}
};