CUDA:将设备数据复制到2D主机阵列

时间:2016-10-03 16:40:59

标签: cuda

我有一个HostMatrix,声明为:

float **HostMatrix

我必须将devicePointer指向的设备矩阵的内容复制到二维主机矩阵HostMatrix

我试过这个

for (int i=0; i<numberOfRows; i++){
    cudaMemcpy(HostMatrix[i], devicePointer, numberOfColumns *sizeof(float),
                 cudaMemcpyDeviceToHost);
    devicePointer += numberOfColumns;// so as to reach next row
}

但这是错误的,因为我在主机函数中执行此操作,并且 devicePointer 无法直接在主机函数中操作,就像我在最后一行中所做的那样。

那么实现这一目标的正确方法是什么?

修改

哦,实际上这将正常工作!但是,如my earlier question: CUDA: Invalid Device Pointer error when reallocating memory 中所述,在解除分配内存时会出现问题。所以基本上以下是不正确的

 for (int i=0; i<numberOfRows; i++){
        cudaMemcpy(HostMatrix[i], devicePointer, numberOfColumns *sizeof(float),
                     cudaMemcpyDeviceToHost);
        devicePointer += numberOfColumns;// so as to reach next row
    }
   cudaFree(devicePointer); //invalid device pointer 

1 个答案:

答案 0 :(得分:2)

您基本上需要首先为devicePointer分配所有必需的内存。但是,随时增加它可能不是最简单的想法,因为那时最后的自由将被打破。假设您有大小为nCols的nRows行。然后这应该正常工作(我没试过,但想法应该没问题):

dat2 <- melt(dat, id.vars = c("x", "P"))
dat2[, c("variable_val", "variable_type") := tstrsplit(variable, "_", fixed = TRUE)]
dat2[, .(calc_val = ((value[P == "P1" & variable_type == "mean"] - 
                        value[P == "P2" & variable_type == "mean"])/
                       value[P == "P1" & variable_type == "sd"])),
         by = .(x, variable_val)]

   x variable_val     calc_val
1: A         Var1   0.85836910
2: B         Var1   0.00000000
3: C         Var1  -0.04310345
4: A         Var2 811.75000000
5: B         Var2 140.00000000
6: C         Var2 168.50000000
7: A         Var3  -5.94412771
8: B         Var3 -18.91759465
9: C         Var3   9.66911765

问题在于,如果你继续增加dPtr,那么最后的cudaFree只会出现在“最后一行”,所以这是错误的。

有意义吗?

相关问题