当主c ++文件包含Cuda时,如何在Clang中编译Cuda?

时间:2019-05-22 17:08:34

标签: cmake cuda clang clang++ ninja

我目前正在一个项目中,我想在Cuda中执行一些代码,应从主c ++文件中调用该代码。当我用Clang编译时,仅编译.cpp文件,并且编译器在<<< >>>内核调用符号上告诉我“ expexpris Exprission”。知道我该如何解决吗?

我有一个包含自己定义的.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“传递给clang参数。

当我添加-x cuda标志时,不会出现错误,而是告诉我所链接的库不允许覆盖某些 host 函数,但是我认为这是因为它想将所有内容都编译为cuda,这不是故意的。

我通过GLOB $ {APP_PATH} / src / *将源文件夹中的所有文件传递给CMake中的add_executable,该文件应添加所有文件。

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);

  ...
}

编辑: 完整的错误消息:

[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]                    ^

编辑: 使用-x cuda执行clang时出现错误消息:

[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]                            ^

我在main.cpp中包含了c ++库cinder,并且出现此错误。

1 个答案:

答案 0 :(得分:3)

C ++中的

#include通过用包含文件的内容从字面上替换该语句来工作。结果,包含的文件也被解析为C ++代码。

要将文件编译为CUDA代码,文件需要是一个单独的编译单元,即作为clang调用的参数来提供。它也需要以.cu结尾的名称,或者需要为-x cuda赋予clang标志。

错误消息包含在问题中后,

更新

由于difference in how __host__/__device__ attributes are treated,Cinder似乎不支持使用clang ++编译CUDA部件。

此时,您的选择如下:

  1. 您可以将Cinder修改为也支持clang ++,它是开源的。

  2. 您可以询问Cinder作者或第三方是否愿意进行必要的更改。现金奖励可能会也可能不会增加意愿。

  3. 您可以使用nvcc来编译代码。