Как перенести объявление типа данных из файла .cpp в файл .cu?

Я обнаружил, что поддержка cuda использует ключевое слово «шаблон» для кода, теперь я хотел бы связать использование «шаблона» между 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>(...);
    .......
}

Я думал, что этот способ функционален, но я надеюсь найти более эффективный и элегантный способ сделать то же самое, большое спасибо!

Lekayef 19.04.2019 04:55

Это читается как вопрос X-Y. Шаблоны полностью поддерживаются, и исправить вашу первоначальную проблему должно быть тривиально, а не пытаться изобрести какую-то нелепую схему для ее замены. В качестве подсказки начните с потери связи C во всем. Связывание C++ полностью поддерживается в CUDA, и если вы используете шаблоны, вам необходимо использовать связывание C++.

talonmies 19.04.2019 08:42

если у вас есть решение, которым вы можете поделиться, добавьте его в ответ. Не редактируйте его в свой вопрос

talonmies 19.04.2019 14:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать перегрузку функций в стиле 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"

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

это то, чего я желал. Спасибо. А что, если у меня много функций, например func1, func2, func3 и т. д. с шаблонами. Могу ли я сделать то же самое с помощью макросов или другим способом?

Lekayef 19.04.2019 08:03

Другие вопросы по теме