Прежде всего, убедитесь, что вы указываете CLION для обработки файлов .cu
и .cuh
как C++ с помощью меню настроек File Types
.
CLion не может анализировать языковые расширения CUDA, но он обеспечивает макрос препроцессора, который определяется только тогда, когда clion анализирует код. Вы можете использовать это, чтобы реализовать почти полную поддержку CUDA самостоятельно.
Большая проблема в том, что анализатор CLion является откос по ключевым словам, как __host__
или __device__
, заставляя его не делать то, что в противном случае знает, как это сделать:
CLion не понял Dtype
в этом примере , потому что материал CUDA путал его разбор.
Самое минимальное решение этой проблемы, чтобы дать clion препроцессора макросы игнорировать новые ключевые слова, зафиксировав худший из разбитости:
#ifdef __JETBRAINS_IDE__
#define __host__
#define __device__
#define __shared__
#define __constant__
#define __global__
#endif
Это фиксирует вышеприведенный пример:
Однако функции CUDA, такие как __syncthreads
, __popc
, по-прежнему не будут индексироваться. Так будет CUDA встроены, как threadIdx
. Один из вариантов заключается в предоставлении бесконечных макросов препроцессора (или даже описаний структур) для них, но это уродливо и жертвует безопасностью типа.
Если вы используете интерфейс Clang CUDA, вы можете сделать лучше. Clang реализует неявно определенные встроенные CUDA, определяя их в заголовках, которые затем включаются при компиляции вашего кода. Они предоставляют определения таких вещей, как threadIdx
. Делая вид, что препроцессор в CUDA компилятора и в том числе device_functions.h
, мы можем получить __popc
и друзей, чтобы работать, тоже:
#ifdef __JETBRAINS_IDE__
#define __host__
#define __device__
#define __shared__
#define __constant__
#define __global__
// This is slightly mental, but gets it to properly index device function calls like __popc and whatever.
#define __CUDACC__
#include <device_functions.h>
// These headers are all implicitly present when you compile CUDA with clang. Clion doesn't know that, so
// we include them explicitly to make the indexer happy. Doing this when you actually build is, obviously,
// a terrible idea :D
#include <__clang_cuda_builtin_vars.h>
#include <__clang_cuda_intrinsics.h>
#include <__clang_cuda_math_forward_declares.h>
#include <__clang_cuda_complex_builtins.h>
#include <__clang_cuda_cmath.h>
#endif // __JETBRAINS_IDE__
Это поможет вам идеальный индексирование практически всего кода CUDA. CLion даже изящно справляется с синтаксисом <<<...>>>
. Это ставит маленькую красную линию под одного символа на каждом конце блока запуска, но в противном случае рассматривает его как функцию вызова - который прекрасно:
Решила проблему! Спасибо –
У меня такая же проблема, но решение не работает. Я использую Clion 2016.2.2 на Ubuntu 16.04. Какую ОС вы используете? – GerryR
Нашли ошибку, просто убедитесь, что файл с 'main' является' .cpp'. – GerryR