gpt4 book ai didi

c++ - 如何在 C++ 中声明外部 cuda 函数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:50 25 4
gpt4 key购买 nike

我对某些 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 文件时,它运行正常。

最佳答案

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

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

您必须将内核调用代码移动到 .cu 中文件。通常,您可以轻松地将其包装在 C++ header 中声明并在 .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);

关于c++ - 如何在 C++ 中声明外部 cuda 函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43627557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com