如何在 C++ 中声明外部 cuda 函数模板
How to declare an external cuda function template in C++
我在使用某些 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);
}
它告诉我"syntax error '<'"。
谁能告诉我应该如何在 C++ 中声明该函数?请注意,当所有内容都放入 .cu
文件时,它运行正常。
这个问题并不太具体,但似乎内核调用(问题中显示的代码)在 .cpp
文件中,而不是在 .cu
文件中。
如果是这样,那确实是问题所在。 name <<<dims>>> (args)
的 CUDA kernel-launching 语法是 NVCC 的语法构造,而不是主机 C++ 编译器的语法构造。因此,任何使用它的代码都必须由 NVCC 处理,这通常转换为 .cu
文件而不是普通的 .cpp
.
您必须将 kernel-invoking 代码移动到 .cu
文件中。通常,您可以轻松地将其包装在 C++ header 中声明并在 .cu
文件中定义的纯 C++ 函数中。使用模板,这并不容易;您必须将整个 if
块移到那里。所以像这样:
共享header文件
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);
我在使用某些 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);
}
它告诉我"syntax error '<'"。
谁能告诉我应该如何在 C++ 中声明该函数?请注意,当所有内容都放入 .cu
文件时,它运行正常。
这个问题并不太具体,但似乎内核调用(问题中显示的代码)在 .cpp
文件中,而不是在 .cu
文件中。
如果是这样,那确实是问题所在。 name <<<dims>>> (args)
的 CUDA kernel-launching 语法是 NVCC 的语法构造,而不是主机 C++ 编译器的语法构造。因此,任何使用它的代码都必须由 NVCC 处理,这通常转换为 .cu
文件而不是普通的 .cpp
.
您必须将 kernel-invoking 代码移动到 .cu
文件中。通常,您可以轻松地将其包装在 C++ header 中声明并在 .cu
文件中定义的纯 C++ 函数中。使用模板,这并不容易;您必须将整个 if
块移到那里。所以像这样:
共享header文件
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);