【问题标题】:How to pass directly a vector from Cuda to LibSVM struct?如何将向量从 Cuda 直接传递到 LibSVM 结构?
【发布时间】:2021-12-14 12:03:16
【问题描述】:

我在尝试与 CUDA 并行化的项目中使用 LibSVM。 问题是,在训练和预测之前,我将有用的数据存储在一个定义为

的结构中
struct svm_node
{
    int index;
    double value;
};

并分配,例如,以这种方式:

struct svm_node** testnode;

testnode = (struct svm_node**)malloc(sz[0] * sz[1] * sizeof(struct svm_node*));

for(i=0; i<sz[0] * sz[1]; i++){
    testnode[i] = (struct svm_node*)malloc((no_classes * tnum + 2) * sizeof(struct svm_node));
}

所以,实际上我有一个矩阵,我可以通过这种方式访问​​它

testnode[0][0].index;
testnode[0][0].value;

现在,indexvalue 是使用 CUDA 获得的,它们存储在两个连续向量(线性化矩阵)中。有没有办法直接将每个向量指针绑定到 testnode 结构,以便在不使用任何 for 循环的情况下“传输”数据?

【问题讨论】:

  • “所以,实际上我有一个矩阵”——不,你有一个指针向量,它不能移植到 GPU。 Stack Overflow 上有大量 AOS 与 SOA 的问题,如果您想搜索它们,可以讨论这个问题
  • @talonmies 是的,这是正确的。但是,我们的想法不是将此指针向量传递给 GPU,而是在数据从设备传输到主机后将来自 GPU 的数据向量的元素与结构中的正确元素相关联。
  • 我了解您的用例。但重点仍然存在。您的“矩阵”条目是单独的分配。它们在内存中不连续。因此,GPU 无法在一次传输中复制到那个不连续的目标内存。在该设计模式中,主机和设备之间没有可移植性

标签: pointers cuda libsvm


【解决方案1】:

有没有办法直接将每个向量指针绑定到 testnode 结构,以便在不使用任何 for 循环的情况下“传输”数据?

不,没有。当使用多次调用主机内存分配器(例如mallocnew)进行分配时(从而创建多个主机指针),您无法使用单个cudaMemcpyXXX 操作将所有引用的数据传输到设备。每个单独创建的主机指针都需要一个cudaMemcpy 调用。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2018-06-02
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2016-03-24
    • 2011-10-19
    相关资源
    最近更新 更多