我使用cudaMemcpy错了吗?

时间:2016-07-21 11:23:55

标签: c++ cuda

我已实现此CuArray以通过实现属性RowsColumns来简化数组使用:

#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}

newcudaMalloc之后的指针值对我来说很合适,但cudaMemcpy似乎不起作用。

那么我做错了什么?

1 个答案:

答案 0 :(得分:1)

通常,以下代码应足以表示存储在GPU中的二维数组。您不需要将其RowsColumns等存储在设备内存中。这些信息通常只需要主机方面。但如果不是您的情况,您可能需要描述有关您的设计考虑的更多详细信息。代码演示了如何使用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;
    }
};