CUDA多个文件 在CUDA+C++中有什么方法可以做到这一点??

CUDA多个文件 在CUDA+C++中有什么方法可以做到这一点??,cuda,Cuda,班级:1 class1 { __device__ ....//some cuda code void ExecuteCuda1(); //this should execute the cuda code in this class } 班级:2 class2 { __device__ ....//some cuda code void ExecuteCuda2(); //this should execute the cuda code in this cl

班级:1

class1
{
   __device__ ....//some cuda code

    void ExecuteCuda1(); //this should execute the cuda code in this class
}
班级:2

 class2
{
   __device__ ....//some cuda code

    void ExecuteCuda2(); //this should execute the cuda code in this class
}
班级:3

class3
{
   cl1 = new class1();
   cl1->ExecuteCuda1();

   cl1 = new class2();
   cl1->ExecuteCuda2();
}
可以,但设备代码(即标有设备全局的功能)必须在需要的同一编译单元中可见,即无链接

因此,只要标题中有
Class1
Class2
的定义,而不仅仅是声明,那么它就应该工作。

是的,但是设备代码(即标有设备全局的函数)必须在需要它的同一编译单元中可见,即没有链接


因此,只要在标题中有
Class1
Class2
的定义,而不仅仅是声明,那么它就应该工作。

不,您的代码不会工作,因为
ExecuteCuda1
ExecuteCuda2
\uuuuuuuuuuuuuu主机
函数,这意味着它们将在CPU上执行。
\uuuu host\uuuu
函数调用任何标记为
\uuuu device\uuuu
的函数是非法的,即使它们是公共类的成员函数

这样构造代码将有效:

__global__ kernel1() {...}

class Class1
{
  void ExecuteCuda1()
  {
    // launch kernel1
    kernel1<<<...>>>();
  }
};

__global__ kernel2() {...}

class Class2
{
  void ExecuteCuda2()
  {
    // launch kernel2
    kernel2<<<...>>>();
  }
};

class Class3
{
  void ExecuteCuda3()
  {
    Class1 cl1 = new class1();
    cl1->ExecuteCuda1();

    Class2 cl2 = new class2();
    cl2->ExecuteCuda2();
  }
};
\uuuuu全局\uuuuuu内核1(){…}
一班
{
void ExecuteCuda1()
{
//启动内核1
内核1();
}
};
__全局内核2(){…}
二级
{
void ExecuteCuda2()
{
//启动内核2
内核2();
}
};
三班
{
void ExecuteCuda3()
{
Class1 cl1=新的Class1();
cl1->ExecuteCuda1();
Class2 cl2=新的Class2();
cl2->ExecuteCuda2();
}
};

请注意,
\uuuuuu全局
函数不能是成员函数,即使它们声明为
静态
。这就是为什么我们必须在任何类之外定义内核。正如Dan所说,由于缺少CUDA链接器,代码必须在单个翻译单元中定义。您可以通过使用头文件在多个文件中实现这一点。

不,您的代码不起作用,因为
ExecuteCuda1
ExecuteCuda2
\uuuuuuuuu主机
函数,这意味着它们将在CPU上执行。
\uuuu host\uuuu
函数调用任何标记为
\uuuu device\uuuu
的函数是非法的,即使它们是公共类的成员函数

这样构造代码将有效:

__global__ kernel1() {...}

class Class1
{
  void ExecuteCuda1()
  {
    // launch kernel1
    kernel1<<<...>>>();
  }
};

__global__ kernel2() {...}

class Class2
{
  void ExecuteCuda2()
  {
    // launch kernel2
    kernel2<<<...>>>();
  }
};

class Class3
{
  void ExecuteCuda3()
  {
    Class1 cl1 = new class1();
    cl1->ExecuteCuda1();

    Class2 cl2 = new class2();
    cl2->ExecuteCuda2();
  }
};
\uuuuu全局\uuuuuu内核1(){…}
一班
{
void ExecuteCuda1()
{
//启动内核1
内核1();
}
};
__全局内核2(){…}
二级
{
void ExecuteCuda2()
{
//启动内核2
内核2();
}
};
三班
{
void ExecuteCuda3()
{
Class1 cl1=新的Class1();
cl1->ExecuteCuda1();
Class2 cl2=新的Class2();
cl2->ExecuteCuda2();
}
};

请注意,
\uuuuuu全局
函数不能是成员函数,即使它们声明为
静态
。这就是为什么我们必须在任何类之外定义内核。正如Dan所说,由于缺少CUDA链接器,代码必须在单个翻译单元中定义。您可以通过使用头文件在多个文件中实现这一点。

是的,我们现在有一个链接器。他们称之为“可重定位设备代码”。是的,我们现在有一个链接器。他们称该选项为“可重定位设备代码”。