2013-07-08 2 views
0

У меня есть классы матриц CPU и GPU (CUDA), и я хочу перегрузить operator(), чтобы я мог читать или писать отдельные элементы матриц.Перегрузка оператора() для класса матрицы CUDA

Для класса матричного процессора, я был в состоянии сделать это

OutType & operator()(const int i) { return data_[i]; } 

(читать) и

OutType operator()(const int i) const { return data_[i]; } 

(запись). Для класса матрицы GPU, я был в состоянии перегружать operator() для чтения с помощью

__host__ OutType operator()(const int i) const { OutType d; CudaSafeCall(cudaMemcpy(&d,data_+i,sizeof(OutType),cudaMemcpyDeviceToHost)); return d; } 

, но я не смог сделать то же самое для письма. Может ли кто-нибудь дать какой-либо намек на решение этой проблемы?

Блок записи для CPU возвращает ссылку data_[i], поэтому задание на назначение выполняется с помощью построителя C++ operator=. Я не могу понять, как я могу использовать тот же механизм для CUDA.

Спасибо.

ответ

1

Вы можете создать отдельный класс, который перегруженный оператор присваивания и оператор приведения типа и эмулирует эталонное поведение:

class DeviceReferenceWrapper 
{ 
public: 
    explicit DeviceReferenceWrapper(void* ptr) : ptr_(ptr) {} 

    DeviceReferenceWrapper& operator =(int val) 
    { 
     cudaMemcpy(ptr_, &val, sizeof(int), cudaMemcpyHostToDevice); 
     return *this; 
    } 

    operator int() const 
    { 
     int val; 
     cudaMemcpy(&val, ptr_, sizeof(int), cudaMemcpyDeviceToHost); 
     return val; 
    } 

private: 
    void* ptr_; 
}; 

и использовать его в матричном классе

class Matrix 
{ 
    DeviceReferenceWrapper operator()(int i) 
    { 
     return DeviceReferenceWrapper(data + i); 
    } 
}; 
+0

Очень умное решение! Большое спасибо. Просто уточнить другие потенциально заинтересованные пользователи. Это решение работает как для «чтения», так и для «письма». Опять же, спасибо. – JackOLantern

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