【问题标题】:cuda: how to copy host data to 3D cuda array and backcuda:如何将主机数据复制到 3D cuda 数组并返回
【发布时间】:2012-06-29 23:18:49
【问题描述】:

“cuda c 编程指南”给出了使用 cuda 数组的示例。 这些示例仅限于 2D。因此,对于 2D cuda 数组,我只需执行以下操作 将主机数据复制到设备内存:

// Copy to device memory some data located at address h_data in host memory  
// cuInputArray is a 2D cuda array
cudaMemcpyToArray(cuInputArray, 0, 0, host_data, size_bytes, cudaMemcpyHostToDevice);
// with e.g. size_bytes := size_arr_x * size_arr_y * sizeof(float)

我尝试了相同的方法,将 cuInputArray 作为 3D cuda 数组,但没有取得多大成功, 得到无效的参数错误。

那么如何将我的主机数据获取到设备内存并返回?

【问题讨论】:

  • 要复制到全局内存吗?还是纹理内存?
  • @pQB:在 CUDA 中没有复制到纹理内存之类的东西。
  • @talonmies (时刻注意 :) 你是对的。我的意思是,如果他想从全局内存或纹理内存中读取输入数据。
  • 目前全局内存就足够了。

标签: c multidimensional-array cuda


【解决方案1】:

为了将 3D 数据复制到 GPU 设备内存中,您需要执行以下操作:

  1. 分配内存空间与cudaMalloc3D
  2. 使用 cudaMemcpy3DParms 设置输入参数
  3. 使用 cudaMemcpy3D复制输入数据从主机到设备

然后,将您的数据返回到主机:

  1. 使用 cudaMemcpy3DParms 设置输出参数
  2. 使用 cudaMemcpy3D 将输出数据从设备复制到主机

CUDA C 编程指南的第 3.2.2 章设备内存有一个 代码示例,该示例分配了一个宽×高×深的浮点值 3D 数组,并展示了如何在设备代码中循环遍历数组元素.

CUDA SDK 的simpleTexture3D 示例也是一个很好的起点。

只是一个建议:准备您的代码以捕获 CUDA 错误并分析发生错误时发生的情况,因为您可能会发现一些错误。

【讨论】:

  • 我更喜欢描述这些步骤,因为您的问题不是关于编程,而是关于 CUDA 的知识。
  • 我认为这为我指明了正确的方向。欣赏它!我假设在我的情况下 1. 会是 cudaMalloc3DArray?
  • CUDA 数组是针对纹理获取优化的不透明内存布局(CUDA C 编程指南,第 3.2.10.3 章),所以如果你想从全局内存中读取数据,你应该使用cudaMalloc3D
猜你喜欢
  • 2013-03-25
  • 2017-08-27
  • 2016-08-30
  • 2015-03-11
  • 2018-03-15
  • 1970-01-01
  • 2017-10-29
  • 2013-03-01
  • 2012-10-07
相关资源
最近更新 更多