C++ 如何在C++;

C++ 如何在C++;,c++,cuda,nvidia,C++,Cuda,Nvidia,我有一些CUDA函数的小问题 我想将.cu文件与.cu文件和.cpp文件中的Nvidia示例分开。内核是一个函数模板。当我在C++文件中声明它是一个外部函数时,我会出错。 定义如下: template <int BLOCK_SIZE> __global__ void matrixMulCUDA(float *C, float *A, float *B, int wA, int wB) template <int BLOCK_SIZE> extern void matr

我有一些CUDA函数的小问题

我想将
.cu
文件与
.cu
文件和
.cpp
文件中的Nvidia示例分开。内核是一个函数模板。当我在C++文件中声明它是一个外部函数时,我会出错。

定义如下:

template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
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);
    }
template\uuuuu全局\uuuuuu\void
matrixMulCUDA(浮点*C、浮点*A、浮点*B、整数wA、整数wB)

我在C++中声明了这样的函数:

template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
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);
    }
模板外部无效
matrixMulCUDA(浮点*C、浮点*A、浮点*B、整数wA、整数wB);
声明没有给我任何错误,但是当它像这样使用时:

template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
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);
    }
if(块大小==16)
{
matrixMulCUDA>>(d_C、d_A、d_B、dimsA.x、dimsB.x);
}
其他的
{
matrixMulCUDA>>(d_C、d_A、d_B、dimsA.x、dimsB.x);
}

它告诉我“syntax error”这个问题并不是太具体,但是内核调用调用(问题中显示的代码)似乎在
.cpp
文件中,而不是
.cu
文件中

<>如果是这样的话,那么代码< >名称(ARGs)的CUDA内核启动语法是NVCC的一个句法结构,而不是主机C++编译器。因此,使用它的任何代码都必须由NVCC处理,NVCC通常转换为<代码> Cu//C>文件而不是普通<代码> CPP > /P> <>你必须把内核调用代码移动到一个Cu文件中。通常,你可以用C++ C++中声明的纯C++函数来简单地包装它,并在<代码> Cu/Cux>文件中定义。使用模板,这并不容易;如果在/<代码>块,你必须移动整个<代码>。
template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
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);
    }
共享头文件

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB);
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);
  }
}
// In some function somewhere
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x);
.cu
文件

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB);
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);
  }
}
// In some function somewhere
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x);

请解释一下,
>
在您使用
matrixMulCuda
时应该意味着什么。是
.cu
文件中的“像这样使用”代码,还是
.cpp
文件?@AlgirdasPreidžius它的CUDA内核调用语法(插入一个奇怪的空格).@Angew,代码来自CUDA示例。@Adi可以,但在分割文件后,代码是在
.cu
文件中还是在
.cpp
文件中?