Я пытаюсь вызвать функцию из ядра и все время получаю ошибки. Моя функция - это аргумент шаблона. Вот ошибка:

 calling a __host__ function("mul ") from a __global__ function("multiply > ") is not allowed. 

Вот мой код:

    template T mul(T a, T b)
{
    return a * b;
}
template 
static __global__ void multiply(int *in, int *out)
{...
 a = myop(b, c);
 ...
}
int main()
{
multiply ><<>>(...);
}

Кто-нибудь знает, что происходит?

JacobS

Ответов: 1

Ответы (1)

Функции, которые предназначены для использования в коде устройства, должны иметь квалификатор __ device __ :

$ cat t1018.cu
#include 
template
__host__ __device__ T mul(T a, T b)
{
    return a * b;
}

template 
static __global__ void multiply()
{
 T b=2;
 T c=5;
 T a = myop(b, c);
 printf("a = %d\n", a);

}
int main()
{
  multiply ><<<1, 1>>>();
  cudaDeviceSynchronize();
}
$ nvcc -o t1018 t1018.cu
$ ./t1018
a = 10
$

2022 WebDevInsider