【发布时间】: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;
现在,index 和 value 是使用 CUDA 获得的,它们存储在两个连续向量(线性化矩阵)中。有没有办法直接将每个向量指针绑定到 testnode 结构,以便在不使用任何 for 循环的情况下“传输”数据?
【问题讨论】:
-
“所以,实际上我有一个矩阵”——不,你有一个指针向量,它不能移植到 GPU。 Stack Overflow 上有大量 AOS 与 SOA 的问题,如果您想搜索它们,可以讨论这个问题
-
@talonmies 是的,这是正确的。但是,我们的想法不是将此指针向量传递给 GPU,而是在数据从设备传输到主机后将来自 GPU 的数据向量的元素与结构中的正确元素相关联。
-
我了解您的用例。但重点仍然存在。您的“矩阵”条目是单独的分配。它们在内存中不连续。因此,GPU 无法在一次传输中复制到那个不连续的目标内存。在该设计模式中,主机和设备之间没有可移植性