Как скомпилировать Cuda в Clang при включении в основной файл C ++? - PullRequest
0 голосов
/ 22 мая 2019

В настоящее время я работаю над проектом, в котором я хочу выполнить некоторый код на Cuda, который должен вызываться из основного файла c ++.Когда я компилирую с Clang, компилируются только файлы .cpp, и компилятор сообщает мне «ожидаемое истечение» в нотации вызова <<< >>> ядра.Любая идея, как я могу это исправить?

У меня есть файлы .cuh с определением, которое я включаю, и исходный файл .cu.Я использую CMake для настройки проекта и сборки его с помощью Ninja.

Я использую ccached clang ++ и поставляю "--cuda-path = / usr / local / cuda-10.1 --cuda-gpu-arch = sm_61 -L / usr / local / cuda-10.1 / lib64 -lcudart_static -ldl -lrt -pthread -std = c ++ 17 "для проверки аргументов.

Когда я добавляю флаг -x cuda, ошибка не появляется, но вместо этого она говорит мне, что библиотека, с которой я ссылаюсь, не может перезаписать какую-либо функцию host , ноЯ думаю, это потому, что он хочет скомпилировать все как cuda, что не предназначено.

Я передаю все файлы в моей исходной папке в add_executable в CMake через GLOB $ {APP_PATH} / src / *, которыйследует добавить все файлы.

main.cpp

#include "ParticleEngine.cuh"

...

int main(){
 simulation_timestep(&this->particles[0], this->gravity, 1, delta_frame,
                      this->particles.size());
}

ParticleEngine.cuh

#pragma once
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

void simulation_timestep(Particle *particles, ci::vec3 gravity, double mass,
                         double time_delta, unsigned long long n_particles);

ParticleEngine.cu

#include "ParticleEngine.cuh"

__global__ void particle_kernel(Particle *particles, ci::vec3 *gravity,
                                double *mass, double *time_delta) {
...
}


void simulation_timestep(Particle *particles, ci::vec3 gravity, double mass,
                         double time_delta, unsigned long long n_particles) {

  ... //memcpy stuff

  particle_kernel<<<dimgrid, dimblock>>>(cuda_particles, cuda_gravity,
                                         cuda_mass, cuda_time_delta);

  ...
}

edit: полное сообщение об ошибке:

[build] In file included from ../src/main.cpp:1:
[build] ../src/ParticleEngine.cu:43:20: error: expected expression
[build]   particle_kernel<<<dimgrid, dimblock>>>(cuda_particles, cuda_gravity,
[build]                    ^

edit: сообщение об ошибке при выполнении clang с -x cuda:

[build] /home/mebenstein/Cinder/include/glm/gtx/io.inl:97:32: error: __host__ __device__ function 'get_facet' cannot overload __host__ function 'get_facet'
[build]         GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios<CTy, CTr>& ios)
[build]                                       ^
[build] /home/mebenstein/Cinder/include/glm/gtx/io.hpp:145:14: note: previous declaration is here
[build]                 FTy const& get_facet(std::basic_ios<CTy,CTr>&);
[build]                            ^

Я включил библиотеку c ++ cinder в main.cpp, и эта ошибка появляется.

1 Ответ

3 голосов
/ 23 мая 2019

#include в C ++ буквально заменяет это утверждение содержимым включенного файла. Как следствие, включенный файл также анализируется как код C ++.

Чтобы скомпилировать файл как код CUDA, файл должен быть отдельной единицей компиляции, то есть задан в качестве аргумента для вызова clang. У него также должно быть имя, оканчивающееся на .cu, либо необходимо присвоить флаг -x cuda clang.

.

Обновление после включения в вопрос сообщений об ошибках:

Похоже, что Cinder не поддерживает компиляцию части CUDA с помощью clang ++ из-за разницы в способах обработки атрибутов __host__ / __device__ .

На данный момент ваши варианты следующие:

  1. Вы можете изменить Cinder, чтобы он также поддерживал clang ++, это с открытым исходным кодом.

  2. Вы можете спросить авторов Cinder или третьих лиц, готовы ли они внести необходимые изменения. Денежный стимул может или не может увеличить готовность.

  3. Вы можете использовать nvcc для компиляции кода.

...