Eigen是一个C++的线性代数库,官网为http://eigen.tuxfamily.org。使用基本数据类型(如基本浮点数数组)很容易,只需将其复制到设备内存并将指针传递给CUDA核函数即可。但Eigen矩阵是复杂类型,因此如何将其复制到设备内存并让CUDA核函数进行读/写呢?
__global__ void cu_dot(Eigen::Vector3f *v1, Eigen::Vector3f *v2, double *out, size_t N)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if(idx < N)
{
out[idx] = v1[idx].dot(v2[idx]);
}
return;
}
将一个包含 Eigen::Vector3f
的数组复制到设备:
Eigen::Vector3f *host_vectors = new Eigen::Vector3f[N];
Eigen::Vector3f *dev_vectors;
cudaMalloc((void **)&dev_vectors, sizeof(Eigen::Vector3f)*N)
cudaMemcpy(dev_vectors, host_vectors, sizeof(Eigen::Vector3f)*N, cudaMemcpyHostToDevice)
Eigen::Matrix
的数据,那么你可以使用 .data()
函数。默认情况下,系数按列主序顺序顺序存储在内存中,如果您要求,则按行主序存储:
如果您只需要访问Eigen :: Matrix
的数据,可以使用.data()
函数来通过原始C指针访问。默认情况下,系数以列优先顺序依次存储在内存中,或者如果您请求,则以行优先顺序存储:
MatrixXd A(10,10);
double *A_data = A.data();
double**
)并使用Eigen::Map
。这样,您将拥有面向普通数据类型的Eigen接口,因此代码不应该出问题,并且可以像通常那样将矩阵发送到GPU作为正常的c数组。缺点是可能无法充分利用Eigen的潜力,但是如果将大部分工作转移到GPU上,则可以接受。
std::complex<double>
。您可以在Eigen中使用实矩阵...您的问题有些混乱:“使用基本数据类型(如基本浮点数组)很容易,并将其复制到设备内存并将指针传递给CUDA内核”,您是指Eigen易于使用普通类型还是CUDA? - luk32