2017-04-26 132 views
1

我在某些CUDA函数中遇到了一些问题。如何在C++中声明外部cuda函数模板

我想分开.cu文件与Nvidia示例中的.cu文件和.cpp文件。内核是一个函数模板。当我在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文件中时,它会正常运行。

+0

请解释一下,在你使用'matrixMulCuda'的时候''>'应该是什么意思。 –

+0

'.cu'文件或'.cpp'文件中的“像这样使用”代码? – Angew

+0

@AlgirdasPreidžius它是CUDA内核调用语法(插入一个奇怪的空间)。 – Angew

回答

1

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

如果是这样的话,那确实是这个问题。 name <<<dims>>> (args)的CUDA内核启动语法是NVCC的语法结构,而不是主机C++编译器的语法结构。任何使用它的代码都必须由NVCC进行处理,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); 
+0

是的,这是个好主意。我会尝试。谢谢@Angew。 – John