1

我有一个结构可以是

  struct type1{ double a,b,c;}

或者它可以是

  struct type2{ double a,b,c,d,e;}

在我的 cuda 代码的主机功能中,我有类似的东西

  void compute(){
      // some code
      // data on devices (up to 10) 
      type *xxx[10];   // this is where i want either type1 or type2 structures
                       // the "type" is not known at compile time but i want to 
                       // determine at runtime based on some input variable. this 
                       // part is not real code rather this is what i want to achive.

      int DevUsed;    // some code to give value to int DevUsed

      for(int idev=0;idev<DevUsed;idev++){

           // set cuda device

          if ( cudaMalloc(&xxx[iDev], sizeof(type)) != cudaSuccess )
            // print error message;
          cudaMemcpy(xxx[iDev], pIF1, sizeof(type), cudaMemcpyHostToDevice);

          function2<<<grid, block>>>(xxx[iDev]);  // where function2 is the kernel
       }
   }

我的问题是使用“type *xxx[10];”等通用代码在 type1 和 type2 数据结构之间进行选择的方法是什么?

4

1 回答 1

1

C++ 模板就是为这种情况而设计的。

template <class T>
void compute(){
  // some code
  // data on devices (up to 10) 
  T xxx[10];   // this is where i want either type1 or type2 structures
                   // the "type" is not known at compile time but i want to 
                   // determine at runtime based on some input variable. this 
                   // part is not real code rather this is what i want to achive.

  int DevUsed;    // some code to give value to int DevUsed

  for(int idev=0;idev<DevUsed;idev++){

       // set cuda device

      if ( cudaMalloc(&xxx[iDev], sizeof(T)) != cudaSuccess )
        // print error message;
      cudaMemcpy(xxx[iDev], pIF1, sizeof(T), cudaMemcpyHostToDevice);

      function2<<<grid, block>>>(xxx[iDev]);  // where function2 is the kernel
   }
}

请注意,您还需要这两种类型的内核模板,例如

template <class T>
__global__ void function2(T x)
{
    //....
}
于 2013-07-13T07:44:19.540 回答