【问题标题】:How to declare an external cuda function template in C++如何在 C++ 中声明一个外部 cuda 函数模板
【发布时间】:2017-04-26 07:23:13
【问题描述】:

我对一些 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);
    }

它告诉我“语法错误'

谁能告诉我应该如何在 C++ 中声明函数?请注意,当所有内容都放在 .cu 文件中时,它运行正常。

【问题讨论】:

  • 请解释一下,&lt;&lt; &lt; grid, threads &gt;&gt; &gt; 在您使用matrixMulCuda 时应该是什么意思。
  • .cu文件还是.cpp文件中的“这样使用”代码?
  • @AlgirdasPreidžius 这是 CUDA 内核调用语法(插入了一个奇怪的空格)。
  • @Angew ,代码来自 CUDA 示例。
  • @Adi 好的,但是在您拆分文件之后,代码是在.cu 文件还是.cpp 文件中?

标签: c++ cuda nvidia


【解决方案1】:

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

如果是这样,那确实是问题所在。 name &lt;&lt;&lt;dims&gt;&gt;&gt; (args) 的 CUDA 内核启动语法是 NVCC 的语法结构,而不是主机 C++ 编译器的语法结构。因此,任何使用它的代码都必须由 NVCC 处理,这通常转化为位于 .cu 文件中,而不是普通的 .cpp

您必须将内核调用代码移动到.cu 文件中。通常,您可以轻松地将其包装在一个纯 C++ 函数中,该函数在 C++ 标头中声明并在 .cu 文件中定义。使用模板,这并不容易;您必须将整个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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2016-02-24
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多