gpt4 book ai didi

c++ - 在下面的例子中如何避免代码复制? C++/库达

转载 作者:行者123 更新时间:2023-11-28 04:30:24 27 4
gpt4 key购买 nike

编辑:这段代码有效,但看起来有很多代码复制部分,我找不到解决这个问题的方法。

在 MatrixDevice 类中,我想调用 kerne.cu 中的内核函数。我将 MatrixDevice 类缩减为仅展示这个概念我是如何实际操作的。

从 MatricDevice 我有一些功能可以将 MatrixDevice 与其他 MatrixDevice 或数字相加,这应该适用于不同的类型,在这个例子中有 float 和 double,这对模板来说应该没有问题,但我必须声明重载函数 MatrixCudaOperations extern 因为我不能将 .cu 文件包含到 .h/.cpp 文件中。

矩阵设备.h

extern void MatrixCudaOperations(const float* a, const float* b, float* result, size_t rows, size_t cols, EOperation operation);
extern void MatrixCudaOperations(const float* a, float b, float* result, size_t rows, size_t cols, EOperation operation);
extern void MatrixCudaOperations(const double* a, const double* b, double* result, size_t rows, size_t cols, EOperation operation);
extern void MatrixCudaOperations(const double* a, double b, double* result, size_t rows, size_t cols, EOperation operation);


template<class T>
class MatrixDevice{

T* data;
size_t rows;
size_t cols;

MatrixDevice& Add(const MatrixDevice &other);
MatrixDevice& Add(T &other);
};

//Operations with MatrixDevice
//Add MatrixDevice to this
template<class T>
MatrixDevice& MatrixDevice::Add(const MatrixDevice &other){
MatrixCudaOperations(data, other.data, data, rows, cols, EOperation::ADD);
return *this;
}

//Add two MatrixDevice and return the result as new MatrixDevice
template<class T>
MatrixDevice Add(const MatrixDevice &a, const MatrixDevice &b){
MatrixDevice result(a);
result.Add(b);
return result;
}

//Add two MatrixDevice to result MatrixDevice
template<class T>
void Add(const MatrixDevice &a, const MatrixDevice &b, MatrixDevice &result){
MatrixCudaOperations(a.data, b.data, result.data, a.rows, a.cols, EOperation::ADD);
}


//Operations with Number

//Add T number to this
template<class T>
MatrixDevice& MatrixDevice::Add(T &other){
MatrixCudaOperations(data, other, data, rows, cols, EOperation::ADD);
return *this;
}

//Add T number to MatrixDevice and return the result as new MatrixDevice
template<class T>
MatrixDevice Add(const MatrixDevice &a, T &b){
MatrixDevice result(a);
result.Add(b);
return result;
}

//Add T number with MatrixDevice to result MatrixDevice
template<class T>
void Add(const MatrixDevice &a, T &b, MatrixDevice &result){
MatrixCudaOperations(a.data, b, result.data, a.rows, a.cols, EOperation::ADD);
}

在内核中,我声明了 MatrixCudaOpertions 的重载函数,并且任何函数中的代码都是相同的。我用模板尝试了这一点,但如果我需要在 MatrixDevice 类中进行外部声明,它就不起作用了。

内核.cu

template<class T> __global__
void d_Add(const T* a, const T* b, T* result){
//code
}

template<class T> __global__
void d_Add(const T* a, T b, T* result){
//code
}

void MatrixCudaOperations(const float* a, const float* b, float* result, size_t rows, size_t cols, EOperation operation){
dim3 blocksize(rows, cols);

switch(operation){
case ADD:
d_Add<<<1,blocksize>>>(a, b, result);
break;
//other cases, subtract, multiply...
}
}

void MatrixCudaOperations(const float* a, float b, float* result, size_t rows, size_t cols, EOperation operation){
dim3 blocksize(rows, cols);

switch(operation){
case ADD:
d_Add<<<1,blocksize>>>(a, b, result);
break;
//other cases, subtract, multiply...
}
}

void MatrixCudaOperations(const double* a, const double* b, double* result, size_t rows, size_t cols, EOperation operation){
dim3 blocksize(rows, cols);

switch(operation){
case ADD:
d_Add<<<1,blocksize>>>(a, b, result);
break;
//other cases, subtract, multiply...
}
}

void MatrixCudaOperations(const double* a, double b, double* result, size_t rows, size_t cols, EOperation operation){
dim3 blocksize(rows, cols);

switch(operation){
case ADD:
d_Add<<<1,blocksize>>>(a, b, result);
break;
//other cases, subtract, multiply...
}
}

最佳答案

从头开始。

template<class T>
class MatrixDevice;

template<class T>
static T const& to_matrix_data( T const& t ) { return t; }
template<class T>
static T const* to_matrix_data( MatrixDevice<T> const& m ) { return m.data; }

template<class T, class Rhs>
void AddInto(MatrixDevice<T>& target, MatrixDevice<T> const& src, Rhs const& rhs) {
MatrixCudaOperations(src.data, to_matrix_data<T>(rhs), target.data, EOperation::ADD );
}

template<class T>
class MatrixDevice{
T* data;
size_t rows;
size_t cols;

template<class Rhs>
MatrixDevice& +=(const Rhs &other)& {
AddInto( *this, *this, other );
return *this;
}

template<class Rhs>
friend MatrixDevice operator+(MatrixDevice lhs, Rhs const& rhs) {
lhs += rhs;
return lhs;
}
};

对 3 个不同的操作使用单词 Add 是不好的。一个是 increment by,一个是 add,最后一个是 add into。

所以我写了一个免费的模板函数AddInto。然后基于增量并添加。

我的添加最多花费你的额外移动,并且根据矩阵的内部结构,移动是免费的。

关于c++ - 在下面的例子中如何避免代码复制? C++/库达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53101336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com