在CUDA内核中使用特征3.3
Using Eigen 3.3 in a CUDA kernel
自2016年11月以来,可以编译引用eigen3.3的cuda代码 - 请参阅此答案
这个答案不是我想要的,现在可能会"过时",因为现在可能会有一种更简单的方法,因为以下内容写在文档中
从eigen 3.3开始,现在可以使用eigen的对象和 CUDA内核中的算法。但是,只有一部分功能是 支持以确保没有触发动态分配 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;
}
我可以编译这个,但似乎不起作用。当我尝试将数据复制到主机时,我会得到illegal memory access
。请注意,我最初将vector3d的vector3d存储为`std :: vector,然后分别使用
cudaMalloc((void **)&p_device_v1, sizeof(Eigen::Vector3d)*n);
cudaMemcpy(p_v1_device, v1.data(), sizeof(Eigen::Vector3d)*n, cudaMemcpyHostToDevice);
我已经在https://github.com/gpmueller/eigen-cuda
在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);
v1.data()
和v2.data()
指针在CPU内存中。您需要在GPU内存中使用指针,即
// Dot product
cu_dot<<<(n+1023)/1024, 1024>>>(dev_v1, dev_v2, dev_ret, n);
cpu vs gpu结果不是相同的,但这是代码的问题,即您没有对多个点产品进行减少。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- CUDA内核和数学函数的显式命名空间
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- CUDA:统一内存和指针地址的更改
- 特征:模板函数中矩阵的平面图
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 调试 CUDA MMU 故障
- 特征 c++:复矩阵的面积双曲正切(atanh)
- C++ 中的特征向量计算
- 使用OpenCV Cuda ORB特征检测器
- 在CUDA内核中使用特征3.3
- 用nvcc(CUDA)编译特征库