如何将向量从 Cuda 直接传递到 LibSVM 结构?

Posted

技术标签:

【中文标题】如何将向量从 Cuda 直接传递到 LibSVM 结构?【英文标题】:How to pass directly a vector from Cuda to LibSVM struct? 【发布时间】: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 无法在一次传输中复制到那个不连续的目标内存。在该设计模式中,主机和设备之间没有可移植性 【参考方案1】:

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

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

【讨论】:

以上是关于如何将向量从 Cuda 直接传递到 LibSVM 结构?的主要内容,如果未能解决你的问题,请参考以下文章

支持向量的数量 libsvm

将 LibSVM 输出转换为浮点向量

Matlab-libsvm - 从原始权重向量、线性核再现决策值

Libsvm 模型中的支持向量是如何排列的?

SWIG:如何将复数向量从 C++ 传递到 python

将 PTX 程序直接传递给 CUDA 驱动程序