Как перенести объявление типа данных из файла .cpp в файл .cu? - PullRequest
0 голосов
/ 19 апреля 2019

Я обнаружил, что поддержка cuda использует ключевое слово «template» для кода, теперь я хотел бы связать использование «template» между nvcc и g ++. Но, похоже, я не могу найти правильный способ его реализации, поэтому я использую строку типа данных, чтобы доставить объявление типа данных. Могу ли я найти лучший способ сделать это?

//in .cpp

extern "C" void function(string T);

int main(){
    function("float");
}

//in .cu

extern "C" void function(string T){
    if(T == "short")
        func<short>(...);
    if(T == "int")
        func<int>(...);
    .......
}

1 Ответ

0 голосов
/ 19 апреля 2019

Вы можете использовать перегрузку функций в стиле C.

// in .cpp

extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();

int main(){
  func_float();
}

// in .cu

template <typename T>
void func() {
  // ...
}

extern "C" void func_short() {
  func<short>();
}

extern "C" void func_int() {
  func<int>();
}

extern "C" void func_float() {
  func<float>();
}

Это значительно быстрее, чем сравнение строк при каждом вызове функции.Если вы хотите, вы можете создать функцию шаблона оболочки на стороне C ++, чтобы сделать использование немного чище.

// in .cpp

extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();

template <typename T>
void func() = delete;

template <>
void func<short>() {
  func_short();
}

template <>
void func<int>() {
  func_int();
}

template <>
void func<float>() {
  func_float();
}

int main(){
  func<float>();
}

Чтобы сделать обслуживание немного проще, вы можете определить некоторые макросы.

// in .cpp

template <typename T>
void func() = delete;

#define DECLARE_FUNC(TYPE)                                                      \
  extern "C" void func_##TYPE();                                                \
  template <>                                                                   \
  void func<TYPE>() {                                                           \
    func_##TYPE();                                                              \
  }                                                                             \

DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)

int main(){
  func<float>();
}

//in .cu

template <typename T>
void func() {
  // ...
}

#define DECLARE_FUNC(TYPE)                                                      \
  extern "C" void func_##TYPE() {                                               \
    func<TYPE>();                                                               \
  }

DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)

Вы можете поместить эти строки DECLARE_FUNC в общий заголовок, чтобы обновлять список только в одном месте.Если вы хотите добавить функцию double, вы можете просто добавить DECLARE_FUNC(double) к заголовку.

// in declare_func.hpp

DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)

// in .cpp

template <typename T>
void func() = delete;

#define DECLARE_FUNC(TYPE)                                                      \
  extern "C" void func_##TYPE();                                                \
  template <>                                                                   \
  void func<TYPE>() {                                                           \
    func_##TYPE();                                                              \
  }                                                                             \

#include "declare_func.hpp"

int main(){
  func<float>();
}

//in .cu

template <typename T>
void func() {
  // ...
}

#define DECLARE_FUNC(TYPE)                                                      \
  extern "C" void func_##TYPE() {                                               \
    func<TYPE>();                                                               \
  }

#include "declare_func.hpp"

Я прошел путь от простого в настройке до простого в обслуживании.Вам придется решить, что подходит для вашей ситуации.

...