Можно ли разбить проекты cuda + thrust на более чем 1 файл - PullRequest
0 голосов
/ 03 ноября 2011

Я строю и проект, который использует технологии Thrust (cuda api) и openMP. Основная цель моей программы - представить интерфейс для вычисления чего-то, говоря одновременно.чтобы сделать это, я решил использовать шаблон проектирования STRATEGY, который в основном означает, что нам нужно определить базовый класс с виртуальной функцией, а затем другие классы, производные от этого базового класса и реализовать необходимую функцию.

моя проблема начинается здесь: 1.Может ли мой проект иметь более 1 файла .CU?2могут ли файлы CU иметь декларацию классов?

  class foo 
        {
            int m_name;
            void doSomething();
        }

3.это продолжается 2., я думаю, что ядра DEVICE не могут быть объявлены внутри классов и должны быть сделаны так:

//header file
__DEVICE__ void kernel(int x, inty)
{.....
}

class a : foo
{
   void doSomething();
}

//cu file

void a::doSomething()
{
  kernel<<<1,1>>>......();
}

это правильный путь?4. последний вопрос, мы используем THRUST, я должен также использовать файлы CU?

Спасибо, игаль

1 Ответ

2 голосов
/ 04 ноября 2011
  1. Да, вы можете использовать несколько .cu файлов в вашем проекте.
  2. Да, но есть ограничения. Согласно * CUDA_C_Programming_Guide * v.4.0, раздел 3.1.5:

    Внешний интерфейс компилятора обрабатывает исходные файлы CUDA в соответствии с правилами синтаксиса C ++. Полный C ++ поддерживается для кода хоста. Однако только подмножество C ++ полностью поддерживается для кода устройства, как описано в Приложении D. Как следствие использования правил синтаксиса C ++, указатели void (например, возвращаемые malloc ()) не могут быть назначены указателям, не являющимся void. без опечатки.

  3. Вы почти правы. Вы должны использовать ключевое слово __global__ при объявлении ядра.

    __global__ void kernel(int x, inty)
    {.....
    }
    
  4. Ну да. На самом деле ваш код устройства с усиленной тягой должен быть скомпилирован с nvcc. Подробнее см. Документацию thrust.

Как правило, вы будете компилировать свои программы так:

    $ nvcc -c device.cu
    $ g++  -c host.cpp   -I/usr/local/cuda/include/
    $ nvcc device.o host.o

Кроме того, вы можете использовать g ++ для выполнения последнего шага связывания.

    $ g++ tester device.o host.o -L/usr/local/cuda/lib64 -lcudart

В Windows измените пути после -I и -L. Также, насколько я знаю, вы должны использовать cl компилятор (MS Visual Studio).

Примечание 1: Следите за совместимостью с x86 / x64: если вы используете 64-битный CUDA Toolkit, используйте также 64-битный компилятор. (отметьте -m32 и -m64 опции nvcc также)

Примечание 2: device.cu содержит ядра и функцию, которая вызывает ядро ​​(я). Эта функция должна быть помечена extern "C". Он может содержать классы (применяются ограничения). host.cpp содержит чистый код C ++ с extern "C" объявлением функции, которая находится в device.cu (НЕ ядро).

...