Я хотел бы реализовать класс векторных векторов устройств, который инкапсулирует указатель на элементы контейнера.
Указатель устройства в классе устройства (Cuda C++)
После того как я создаю объект этого класса, у меня нет доступа к внутреннему указателю. Он всегда говорит: «Место нарушения прав доступа - адрес памяти устройства».
Мой код выглядит следующим образом:
#include <iostream>
#include <cuda_runtime.h>
template <typename T>
class DeviceVector
{
private:
T* m_bValues;
std::size_t m_bSize;
public:
__host__
void* operator new(std::size_t size)
{
DeviceVector<T>* object = nullptr;
cudaMalloc((void**)&object, size);
return object;
}
__host__
void operator delete(void* object)
{
cudaFree(object);
}
__host__
DeviceVector(std::size_t size = 1)
{
cudaMemcpy(&m_bSize, &size, sizeof(std::size_t), cudaMemcpyHostToDevice);
// At this cudaMalloc I get Access violation writing location...
cudaMalloc((void**)&m_bValues, size * sizeof(T));
// It's an alternative solution here
T* ptr;
cudaMalloc((void**)&ptr, size * sizeof(T));
cudaMemcpy(&m_bValues, &ptr, sizeof(T*), cudaMemcpyHostToDevice);
// The memory is allocated
// But I can't access it through m_bValues pointer
// It is also Access violation writing location...
}
__host__
~DeviceVector()
{
// Access violation here if I use the second solution in the constructor
cudaFree(m_bValues);
}
};
int main()
{
DeviceVector<int>* vec = new DeviceVector<int>();
delete vec;
return 0;
}
Примечание: У меня есть доступ к атрибуту размера.
Так что мои вопросы:
Как выделить память для этого класса, чтобы получить доступ к указателю внутри?
Можно ли даже инкапсулировать указатель на класс на устройстве?
SO [ожидает] (http://stackoverflow.com/help/on-topic) для таких вопросов («почему этот код не работает?»), Что вы предоставляете [MCVE] (http://stackoverflow.com/help/mcve). –
Почему ваш конструктор пытается скопировать в 'm_bSize' с помощью API CUDA? – talonmies
Поскольку параметр 'size' конструктора находится в памяти хоста, а атрибут' m_bSize' находится в памяти устройства. –