Вызов ядра приводит к ошибке «ошибка: вызов функции хоста не может быть настроен». Что не так с вызовом? - PullRequest
0 голосов
/ 27 апреля 2019

При компиляции следующего фрагмента кода с использованием nvcc -c mag_cuda.cu:

//Standard Libraries
#include <iostream>
#include <math.h>
#include <vector>

//Project Specific Header
#include "mag.hpp"

 __global__
  void indv_B_components(int *self_coords, int pole_coords[][3], double *indv_B[][3], int No_poles, int counter_1)
  {
    some code......
  }

  //----------------------------------------------------------
  //------- Function to Calculate B Field at Each Pole -------
  //----------------------------------------------------------
  void calc_indv_B()
  {
    //declare namepspace for internal variables
    using namespace mag::internal;

    int *ppole_coords = &pole_coords[0][0];
    double *pindv_B;
    int self_coords[3];

    int num_threads_in_block = 256;
    int num_blocks = 32*2;

    cudaMallocManaged(&pindv_B, No_poles*3*sizeof(int));  


    //first loop to go over all poles
    for(int counter_1 = 0; counter_1 < No_poles; counter_1++)
      {
      //store coords of the current pole
      self_coords[0] = pole_coords[counter_1][0];
      self_coords[1] = pole_coords[counter_1][1];
      self_coords[2] = pole_coords[counter_1][2];


      indv_B_components<<<num_blocks, num_threads_in_block>>>(self_coords, ppole_coords,  pindv_B, No_poles, counter_1); 



      cudaDeviceSynchronize();
      }

    cudaFree(pindv_B);

    //return from function
    return;
  }

Возвращается следующая ошибка:

ошибка: невозможно настроить вызов функции хоста

Что относится к строке

indv_B_components<<<num_blocks, num_threads_in_block>>>(self_coords, ppole_coords,  pindv_B, No_poles, counter_1); 

Поскольку все параметры определены, и ядро ​​хост-устройства вызывает объявленный как __global__ Я не знаю, что может быть причиной этого.

Заголовочный файл mag.hpp:

//make sure MAG_H_ module hasnt been defined multiple times
#ifndef MAG_H_
#define MAG_H_

//standard libraries
#include <iostream>
#include <math.h>
#include <vector>


//Namespace for module
namespace mag
{


  //define functions
  ...


  void indv_B_components(int *self_coords, int *pole_coords, double *indv_B, int No_poles, int counter_1);

  void calc_indv_B();

  ...
}
#endif //MAG_H_

Любая помощь?

1 Ответ

4 голосов
/ 27 апреля 2019

Одна из ситуаций, в которой возникает эта ошибка, заключается в том, что у вас есть просто «объявление» вашей функции ядра без спецификатора __global__ в точке, где вы вызываете ядро, например:

void kernel();

void f()
{
    kernel<<<1, 1>>>();
}

__global__
void kernel()
{
}

живая демонстрация здесь

Объявление функции ядра должно включать спецификатор __global__:

__global__ void kernel();

В противном случае объявление не объявляет функцию ядра, а простообычная функция хоста, поэтому компилятор жалуется, поскольку на графическом процессоре может быть запущена только функция ядра…

...