【问题标题】:allocate memory with cudaMalloc使用 cudaMalloc 分配内存
【发布时间】:2014-04-11 22:29:13
【问题描述】:

如果我声明一个变量:

define SIZE = 900; // width and height of an image

float ** abc;

那么如果我想在GPU上为其分配内存,我应该这样分配吗?

cudaMalloc(&abc, SIZE * SIZE * sizeof(float));

因为我收到警告:整数运算结果超出范围。

如果我这样声明:

cudaMalloc(&abc, SIZE * sizeof(float));

那就好了,不知道是不是二维数组,应该分配什么?

提前致谢。

【问题讨论】:

  • 我很想帮助你,但是你的问题实在是不清楚,请清理一下。
  • 我觉得应该很清楚了吧?
  • 不,您声明了“abc”,然后使用了“GPU_input”和“SIZE”,我们不知道它们是什么。我们只能尝试猜测。无论如何,该错误与 CUDA 无关。
  • 什么是“abc”,它与 cudaMalloc 调用有何对应关系? SIZE 变量中有什么?你让谁倍增他们?会不会是你试图在二维中 malloc 一些东西?
  • 嗨,这是我的错误。我已经更新了!对不起。谢谢大家!

标签: cuda


【解决方案1】:

此代码是否给您同样的警告?

  const size_t SIZE = 900;
  float *abc;
  cudaMalloc((void **)&abc, SIZE * SIZE * sizeof(float));

试试这个代码,而不是类似的代码......如果这不起作用,我猜这是不是你的错的严重问题。

你为什么要声明 abc 是一个双重间接指向 float 的指针? malloc() 和 cudaMalloc() 仅分配连续的内存块...如果您想将 abc 解释为二维数组,则必须制定这样做的逻辑(转换为/从二维和线性指数)你自己。你要求 nvcc 做的是为 float* 分配 3,240,000 字节的内存,它应该只需要 4 个字节来存储。

【讨论】:

  • 此外,如果您想进行 2D 分配,您几乎肯定需要“倾斜”分配(使用 cudaMallocPitch()),因此 CUDA 驱动程序可以以一种可口的方式填充分配无论您在什么硬件上运行。
【解决方案2】:

cudaMalloc 不分配二维数组,你可以将一维数组转换成二维数组,或者你必须先为 float **abc 分配一个一维指针数组,然后为**abc中的每个指针分配float数组,如下所示:

float ***abc;
float ***h_abc = malloc(SIZE * sizeof(float*));
cudaMalloc(&abc,SIZE * sizeof(float*));
for(int i = 0 ; i < SIZE ; i++ ){
     cudaMalloc(&(h_abc[i]), SIZE * sizeof(float)):
}
cudaMemcpy(&abc,h_abc,SIZE * sizeof(float*));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2019-12-27
    • 2012-11-30
    • 2011-08-18
    • 1970-01-01
    • 2012-08-27
    • 2018-12-23
    相关资源
    最近更新 更多