当主 C++ 文件包含时,如何在 Clang 中编译 Cuda?
How to compile Cuda within Clang when included by main c++ file?
我目前正在做一个项目,我想在 Cuda 中执行一些代码,这些代码应该从主 c++ 文件中调用。当我用 Clang 编译时,只编译 .cpp 文件,编译器在 <<<>>> 内核调用符号上告诉我 "expected 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 args。
当我添加 -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 并且出现了这个错误。
#include
在 C++ 中的工作原理是用包含文件的内容逐字替换该语句。因此,包含的文件也被解析为 C++ 代码。
要将文件编译为 CUDA 代码,文件需要是一个单独的编译单元,即作为参数提供给 clang
调用。它还需要有一个以 .cu
结尾的名称,或者需要将 -x cuda
标志提供给 clang
.
更新 在问题中包含错误消息后:
由于 difference in how __host__
/__device__
attributes are treated.
,Cinder 似乎不支持使用 clang++ 编译 CUDA 部分
此时您的选择如下:
你可以修改Cinder使其也支持clang++,它是开源的
您可以询问Cinder作者或第三方是否愿意进行必要的修改。现金奖励可能会也可能不会增加意愿。
您可以使用nvcc
编译代码。
我目前正在做一个项目,我想在 Cuda 中执行一些代码,这些代码应该从主 c++ 文件中调用。当我用 Clang 编译时,只编译 .cpp 文件,编译器在 <<<>>> 内核调用符号上告诉我 "expected 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 args。
当我添加 -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
:
[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 并且出现了这个错误。
#include
在 C++ 中的工作原理是用包含文件的内容逐字替换该语句。因此,包含的文件也被解析为 C++ 代码。
要将文件编译为 CUDA 代码,文件需要是一个单独的编译单元,即作为参数提供给 clang
调用。它还需要有一个以 .cu
结尾的名称,或者需要将 -x cuda
标志提供给 clang
.
更新 在问题中包含错误消息后:
由于 difference in how __host__
/__device__
attributes are treated.
此时您的选择如下:
你可以修改Cinder使其也支持clang++,它是开源的
您可以询问Cinder作者或第三方是否愿意进行必要的修改。现金奖励可能会也可能不会增加意愿。
您可以使用
nvcc
编译代码。