GPM*_*ler 7 c++ cuda c++11 eigen3
自2016年11月起,可以编译引用Eigen3.3的CUDA代码 - 请参阅此答案
这个答案不是我正在寻找的,现在可能已经"过时",因为现在可能有一种更简单的方法,因为以下是在文档中写的
从Eigen 3.3开始,现在可以在CUDA内核中使用Eigen的对象和算法.但是,仅支持一部分功能,以确保在CUDA内核中不会触发动态分配.
另见这里.不幸的是,我无法找到任何这样的例子.
现在是否可以编写如下的内核,它应该只计算一堆点积?
__global__ void cu_dot(Eigen::Vector3d *v1, Eigen::Vector3d *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;
}
Run Code Online (Sandbox Code Playgroud)
我可以编译它,但它似乎不起作用.当我尝试将数据复制到主机时,我明白了illegal memory access
.请注意,我最初将Vector3d存储为`std :: vector然后分别使用
cudaMalloc((void **)&p_device_v1, sizeof(Eigen::Vector3d)*n);
cudaMemcpy(p_v1_device, v1.data(), sizeof(Eigen::Vector3d)*n, cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)
我在https://github.com/GPMueller/eigen-cuda上使用CMake 建立了一个MWE项目
在github上的MWE项目中,您写道:
double dot(std::vector<Eigen::Vector3d> v1, std::vector<Eigen::Vector3d> v2)
{
...
// Dot product
cu_dot<<<(n+1023)/1024, 1024>>>(v1.data(), v2.data(), dev_ret, n);
Run Code Online (Sandbox Code Playgroud)
在v1.data()
和v2.data()
指针在CPU内存.您需要使用GPU内存中的指针,即
// Dot product
cu_dot<<<(n+1023)/1024, 1024>>>(dev_v1, dev_v2, dev_ret, n);
Run Code Online (Sandbox Code Playgroud)
CPU与GPU的结果并不相同,但这是代码的问题,即您没有对多点产品进行减少.