如何在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);
}
它告诉我"语法错误"&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);
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 在函数内部的声明中初始化数组,并在外部使用它
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 使外部项目可用于find_package CMake
- CUDA内核和数学函数的显式命名空间
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- 如何在C 中声明外部CUDA函数模板
- 在 CUDA 项目中使用外部库类
- 不支持外部调用 - CUDA
- 在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数
- 将外部 C/C++ CUDA 库与 C# 一起使用
- CUDA外部类链接和ptxas文件中未解析的外部函数
- 在内核外部使用CUDA printf来打印设备变量
- 以前在 CUDA C++ 中定义的外部全局设备变量