2016-07-21 3 views
1

я реализовал эту CuArray, чтобы упростить использование массива с реализацией от свойств Rows и Columns:Я использую cudaMemcpy неправильно?

#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 64bit
cuArray = {0xb6e8b0, Ряды = 11, Столбцы = 1, элементы = 11}
размер = 32
gpuCuArray = {0x7053e3600, Ряды = 0, Столбцы = 0, элементы = 0}

значения указателей после new и cudaMalloc выглядит хорошо для меня, но cudaMemcpy не похоже на работу.

Так что я делаю неправильно?

ответ

1

Обычно для представления 2-мерного массива, хранящегося на графическом процессоре, должно быть достаточно следующего кода. Вам не нужно хранить свои 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; 
    } 
}; 
+0

Я новичок в кодировании в CUDA, но ваша аргументация, кажется, хорошо, потому что если я называю ядро ​​я буду называть его от хоста, а затем я могу передать строки и столбцы в качестве параметра в ядро. Но это требует большего количества параметров. – Jens

+0

Однако ваше решение не решает проблему с cudaMemcpy. Было бы здорово понять, почему он не работает в моем коде. – Jens

+0

@JensHorstmann, так что с вашим исходным кодом, каково ваше ожидание? что, похоже, не работает? Вы можете более подробно рассказать о том, над чем работаете. – kangshiyin

Смежные вопросы