CUDA模板错误:没有函数模板的实例与参数列表匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUDA模板错误:没有函数模板的实例与参数列表匹配相关的知识,希望对你有一定的参考价值。

编译错误,我无法弄清楚。我的函数调用似乎与参数列表匹配。

nvcc -o main main.cu

error:  no instance of function template "gemm_template_batched_nn_kernel" matches the argument list argument types are (int, int, int, double **, int, double **, int, double **, int, double, double)

gemm.h

template <typename T, const int DIM_X, const int DIM_Y,
         const int BLK_M, const int BLK_N, const int BLK_K, 
         const int DIM_XA, const int DIM_YA, const int DIM_XB, const int DIM_YB, 
         const int CONJA, const int CONJB>
static __global__
void gemm_template_batched_nn_kernel(
    int M, int N, int K,
    T const * const * Aarray, int LDA,
    T const * const * Barray, int LDB,
    T**       Carray, int LDC,
    T alpha, T beta)
{
    const int batchid = blockIdx.z;

    gemm_template_device_nn
        <T, DIM_X, DIM_Y, BLK_M, BLK_N, BLK_K, DIM_XA, DIM_YA, DIM_XB, DIM_YB, (BLK_M/DIM_X), (BLK_N/DIM_Y), CONJA, CONJB>
        ( M, N, K, 
          Aarray[batchid], LDA, 
          Barray[batchid], LDB, 
          Carray[batchid], LDC, 
          alpha, beta );
}

卖弄.粗

#include "gemm.h"
#define N 256
#define BLK_M 16
#define DIM_X 16
#define DIM_Y 16

int main() {
    double *Ad, *Bd, *Cd;
    dim3 dimGrid(N/BLK_M, N/BLK_M);
    dim3 dimBlock(DIM_X, DIM_Y);
    ...
    gemm_template_batched_nn_kernel<double><<<dimGrid,dimBlock>>>(N,N,N,&Ad,N,&Bd,N,&Cd,N,1.0,1.0);
    ...
}
答案

我的评论似乎有效,所以把它作为答案......

您的模板有十二个模板参数,没有默认值;而你正试图用一个(<double>)实例化它。指定所有这些,或指定none。

其他说明:

  • 拥有这么多参数并不是一个好主意,可以考虑将它们放入某个结构中,或者使用spans
  • CUDA中的数组指针?可能是一个坏主意
  • 作为CUDA编程指南suggests,您应该使用__restrict__作为指针参数。

以上是关于CUDA模板错误:没有函数模板的实例与参数列表匹配的主要内容,如果未能解决你的问题,请参考以下文章

没有函数模板“std::make_pair”的实例与参数列表匹配

在标头之间调用时,模板实例化无法匹配重载流运算符的参数列表

错误E0289:没有构造函数“ Movie :: Movie”的实例与基本程序(C ++)的参数列表匹配

没有重载函数“AfxBeginThread”的实例与参数列表匹配

函数申明对函数模板实例化的屏蔽

模板参数推导与 QT lambda 不匹配