如何在C 中声明外部CUDA函数模板



我在某些cuda函数上有一点问题。

我想将.cu文件与.cu文件和.cpp文件中的NVIDIA示例分开。内核是函数模板。当我将其声明为C 文件中的外部函数时,我会遇到错误。

定义看起来像这样:

template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)

我已经在C 中声明了该功能:

template <int BLOCK_SIZE> extern void 
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB);

声明不会给我任何错误,但是当这样使用时:

if (block_size == 16)
    {
        matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
    }
    else
    {
        matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
    }

它告诉我"语法错误"&lt;'。

有人可以告诉我如何在C 中声明该功能?请注意,当所有内容都放在.cu文件中时,运行正常。

问题不是太具体了,但是似乎内核调用调用(问题中显示的代码(在.cpp文件中,而不是在.cu文件中。

如果是这样,那确实就是问题。name <<<dims>>> (args)的CUDA内核拉力语法是NVCC的语法结构,而不是主机C 编译器的构造。因此,任何使用它的代码都必须由NVCC处理,NVCC通常会转化为在.cu文件中而不是普通.cpp中。

您必须将启动内核代码移至.cu文件中。通常,您可以轻松地将其包裹在C 标头中声明并在.cu文件中定义的纯C 函数。使用模板,这并不容易。您必须将整个if块移动到其中。这样的东西:

共享标头文件

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB);

.cu文件

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB)
{
  if (block_size == 16)
  {
    matrixMulCUDA <16> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
  }
  else
  {
    matrixMulCUDA <32> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
  }
}

.cpp文件

// In some function somewhere
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x);

最新更新