使用cudamaloc分配内存

使用cudamaloc分配内存,cuda,Cuda,如果我声明一个变量: define SIZE = 900; // width and height of an image float ** abc; 所以如果我想在GPU上为它分配内存,我应该这样分配吗 cudaMalloc(&abc, SIZE * SIZE * sizeof(float)); 因为我得到一个警告:整数运算结果超出范围 如果我这样声明: cudaMalloc(&abc, SIZE * sizeof(float)); float ***abc; floa

如果我声明一个变量:

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

float ** abc;
所以如果我想在GPU上为它分配内存,我应该这样分配吗

cudaMalloc(&abc, SIZE * SIZE * sizeof(float));
因为我得到一个警告:整数运算结果超出范围

如果我这样声明:

cudaMalloc(&abc, SIZE * sizeof(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*));
那就好了,我不知道数组是否是二维的,我应该分配什么


提前感谢。

此代码是否会给您相同的警告

  const size_t SIZE = 900;
  float *abc;
  cudaMalloc((void **)&abc, SIZE * SIZE * sizeof(float));
请完全尝试此代码,而不是类似的代码。。。如果这不起作用,我猜有一个严重的问题不是你的错


为什么要声明abc是指向float的双间接指针?malloc()和cudaMalloc()只分配连续的内存块。。。如果您想将abc解释为二维数组,您必须自己制定这样做的逻辑(转换为二维和线性索引)。您要求nvcc做的是为浮点*分配3240000字节的内存,该浮点*只需要4个字节即可存储。

此代码是否给出了相同的警告

  const size_t SIZE = 900;
  float *abc;
  cudaMalloc((void **)&abc, SIZE * SIZE * sizeof(float));
请完全尝试此代码,而不是类似的代码。。。如果这不起作用,我猜有一个严重的问题不是你的错


为什么要声明abc是指向float的双间接指针?malloc()和cudaMalloc()只分配连续的内存块。。。如果您想将abc解释为二维数组,您必须自己制定这样做的逻辑(转换为二维和线性索引)。您要求nvcc为浮点*分配3240000字节的内存,它只需要4个字节即可存储。

Cudamaloc不分配二维数组,您可以将一维数组转换为二维数组,或者您必须首先为浮点**abc分配一维指针数组,然后为**abc中的每个指针分配浮点数组,如下所示:

cudaMalloc(&abc, SIZE * sizeof(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*));
float***abc;
浮点数***h_abc=malloc(大小*浮点数*);
Cudamaloc(和abc,尺寸*尺寸(浮动*);
对于(int i=0;i
Cudamaloc不分配二维数组,您可以将一维数组转换为二维数组,或者您必须首先为浮点**abc分配一维指针数组,然后为**abc中的每个指针分配浮点数组,如下所示:

cudaMalloc(&abc, SIZE * sizeof(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*));
float***abc;
浮点数***h_abc=malloc(大小*浮点数*);
Cudamaloc(和abc,尺寸*尺寸(浮动*);
对于(int i=0;i
我很想帮助您,但您的问题确实不清楚,请澄清。我认为应该清楚,不是吗?不是,您声明“abc”,然后使用“GPU输入”和“大小”,我们不知道它们是什么。我们只能试着猜测。该错误与CUDA无关。“abc”是什么?它如何对应CUDAMALOC调用?大小变量中有什么?你是谁在把它们相乘?可能是你想在二维空间中对某些东西进行malloc吗?嗨,这是我的错误。我已经更新了!我很抱歉。谢谢大家!我很想帮助你,但你的问题确实不清楚,请澄清。我认为应该清楚,不是吗?不是,你声明“abc”,然后使用“GPU输入”和“大小”,我们不知道它们是什么。我们只能试着猜测。该错误与CUDA无关。“abc”是什么?它如何对应CUDAMALOC调用?大小变量中有什么?你是谁在把它们相乘?可能是你想在二维空间中对某些东西进行malloc吗?嗨,这是我的错误。我已经更新了!我很抱歉。谢谢大家!此外,如果要进行2D分配,几乎可以肯定要进行“倾斜”分配(使用cudamallocitch()),因此CUDA驱动程序可以以任何硬件都能接受的方式填充分配。此外,如果要进行2D分配,几乎可以肯定要进行“倾斜”分配(使用cudamallocitch())),因此CUDA驱动程序可以以您运行的任何硬件都可以接受的方式填充分配。