【问题标题】:cudamalloc of 2D array二维数组的cudamalloc
【发布时间】:2015-04-13 16:47:42
【问题描述】:

我正在尝试将 2D 矩阵从主机复制到设备。这是我写的

    int dev=0;
    cudaSetDevice(dev);

    uint16_t * dev_matrix;
    size_t pitch;
    cudaMallocPitch(&dev_matrix,&pitch, 1024*sizeof(uint16_t), 65536);
    cudaMemcpy2D(dev_matrix, pitch, matrix, 1024*sizeof(uint16_t),  1024*sizeof(uint16_t), 65536, cudaMemcpyHostToDevice);
    //kernel function to implement
    cudaFree(dev_matrix);
    free (matrix);

matrix 是一个 2D uint16_t 向量 (1024x65536)。这段代码返回了分段错误,我不明白为什么

【问题讨论】:

  • 提供完整的代码。其他人可以复制、粘贴、编译和运行并查看问题,而无需添加任何内容或更改任何内容。在您开始向他人寻求帮助之前,您应该始终使用proper cuda error checking。为什么不在你的代码中准确地显示你是如何定义matrix 而不是描述它?
  • 如果我为matrix 添加定义,您发布的代码对我来说很好。我的例子是here。如果您正在做类似std::vector<std::vector<uint16_t> > matrix; 的事情,那将无法正常工作。 cudaMemcpy 的输入必须是平面分配。
  • 它有 1000 行长!我剪了。我无法复制和粘贴整个代码!我向你保证它在工作之前写的内容!
  • 我不是要你的全部代码。我已经证明,我可以利用您发布的内容,只用几行代码就可以制作出一个完整的程序。做这样的事情。你不明白你对matrix 的定义很重要吗?你需要证明这一点。请注意,您提供了MCVE 的 SO expects。您尚未提供 MCVE。没有人愿意看到你的整个代码。只是一个重现问题的简短示例。
  • @domenico:您在评论中发布的详细信息是了解您的问题的关键信息。从一开始就应该在您的问题中。

标签: c++ cuda malloc


【解决方案1】:

这不能用作单个cudaMemcpy 操作的来源:

uint16_t **matrix = new uint16_t*[1024]; 
for(int h = 0; h < 1024; ++h) matrix[h] = new uint16_t[65536];

在主机代码中对new 的每次调用都会创建一个单独 分配,并且不能保证这些分配是连续的或相邻的。因此,我们不能将单个指针传递给cudaMemcpy2D 并期望它能够发现所有分配的位置。 cudaMemcpy2D 需要一个连续的分配。

请注意,cudaMemcpy2D 需要一个单指针 (*),而您传递的是一个双指针 (**)。

最简单的解决方案是像这样将matrix 展平:

uint16_t *matrix = new uint16_t[1024*65536];

并使用索引算法进行 2D 访问。

【讨论】:

  • 我们真的应该找到数百个指针问题副本数组之一,清理它,并将其用作默认的重复关闭。这必须每周至少出现一次......
  • 我也想过这个问题(很多次)。每次我想到它,我都会开始迷失在所有可能的变化和建议中,我无法想出任何简明扼要的东西。
  • @talonmies 你写了一个 superb 规范的错误检查问题。在我看来,你写了规范的二维数组访问答案here。 (也许我应该把它标记为一个骗局。)如果你想写一个新的问题/答案,我会赞成,我相信其他人也会。我知道这违背了你目前的立场,所以如果你想编辑你以前的答案之一,那也可以。我愿意接受建议。
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2019-01-23
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多