Pointers 通过另一个函数分配多个gpu

Pointers 通过另一个函数分配多个gpu,pointers,cuda,Pointers,Cuda,使用CUDA,我想为不同的数组分配内存,每个GPU分配一个内存,使用不同于main()的函数,但我肯定错过了指针算法方面的一些内容。我是这么想的 void InitThisMemory(int***, int N, int Nout, size_t* pitch, int height, int width); // This function's purpose is to initialize A and the pitch int main(void){ int** A; i

使用CUDA,我想为不同的数组分配内存,每个GPU分配一个内存,使用不同于main()的函数,但我肯定错过了指针算法方面的一些内容。我是这么想的

void InitThisMemory(int***, int N, int Nout, size_t* pitch, int height, int width); // This function's purpose is to initialize A and the pitch

int main(void){
   int** A;
   int N = 10; 
   int NOut = 2;
   int height = 2, width = 2;
   size_t pitch;
   InitThisMemory(&A, N, NOut, &pitch, height, width);
   return 0;
}

InitThisMemory(int ***A, int N, int Nout, size_t* pitch, int height, int width){
  int i;
  *A = (int**)malloc(Nout * sizeof(int*));
  for(i = 0;i < Nout;i++){
      cudaSetDevice(i);
      cudaMallocPitch((void**)&(*A[i]), &(*pitch), width, height);
  }
}
void InitThisMemory(int***,int N,int Nout,size_t*pitch,int height,int width);//此函数的目的是初始化A和俯仰
内部主(空){
国际**A;
int N=10;
int NOut=2;
内部高度=2,宽度=2;
大小和间距;
InitThisMemory(&A、N、NOut和pitch、height、width);
返回0;
}
InitThisMemory(int***A、int N、int Nout、size_t*间距、int高度、int宽度){
int i;
*A=(int**)malloc(Nout*sizeof(int*);
对于(i=0;i
免责声明:不是我的实际代码,但这应该会重现错误。如果我遗漏了某个变量的分配,请告诉我

为什么我认为问题出在算术上?原因很简单,如果
Nout=1
(这意味着我只使用了一个设备),这项功能就非常有效


有什么想法吗?

我想你的bug是在写
(void**)和(*A[I])
而不是
(void**)(&(*A[I])
,但我建议你重构如下:

  • 使用本地int**变量保存
    malloc()
    返回值
  • 在调用
    cudamallocitch()
    时使用该本地语言
  • 仅当所有
    cudamallocitch()
    调用成功时,才传回
    malloc()
    返回值
    如果您做了这些事情,那么在其中一个
    cudamallocitch()
    调用失败的情况下编写正确的清理代码会更简单,并且除非一切都成功,否则您不需要传播回传。

    for(i=0;i
    ——难道您没有忘记递增
    i
    ?您如何将
    宽度
    高度
    传递到
    初始化内存
    ?当然可以。谢谢你。这也是固定的。这段代码是直接在浏览器中编写的,速度有点快,所以请原谅我遗漏了一些“琐碎”的东西。在这个问题中,工作/不工作到底意味着什么?你有API错误吗?“不工作”的症状是什么?一个主要症状是:当I=1表示Nout=2时,我立即出现分段故障。好像我不是在第二个指针上写and*int,而是在写别的东西。嗯<代码>&(*pitchDev)
    ?怎么样
    !!是否正确
    ?此外,我在任何地方都看不到
    pitchDev
    的定义——它能编译吗?先生,你让我很开心。就这样!现在,关于编写这样的代码,我真的很想知道问题是a)没有错误检查,还是b)试图以最复杂的、肯定会产生错误的方式来做事情。如果是(a),那么如上所述,这只是我直接在浏览器中编写的代码,在我看来,它再现了内存错误。原始代码在InitThisMemory返回之前检查所有内容。如果是(b)。。。嗯,我想你是对的。当然,感谢您分享您的经验!我会记住这一点。(a)和(b)是相互关联的。如果编写更简单的代码,那么编写正确检查错误的代码就更容易了。像您的代码示例那样内联间接寻址对性能没有好处,因此它只会带来负面影响(失去清晰度),而没有正面影响。同样,如果你正在传递一个分配的结构指针,那么你必须在每次撤销它时对括号进行括号化(即(*p)->成员不是p- >成员)。最好使用本地文件,然后将其传回。至于错误处理,这里最好使用goto实现,但这是另一个主题。