Я разрабатываю пользовательский OP для tenorflow, который нуждается в поддержке GPU, следуя инструкциям в документация тензорного потока. Отслеживая ошибки в моем собственном коде, я вернулся к примеру из документации и попытался скомпилировать пример ссылочного кода:
#if GOOGLE_CUDA
#define EIGEN_USE_GPU
#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"
__global__ void AddOneKernel(const int* in, const int N, int* out) {
for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < N;
i += blockDim.x * gridDim.x) {
out[i] = in[i] + 1;
}
}
void AddOneKernelLauncher(const int* in, const int N, int* out) {
AddOneKernel<<<32, 256>>>(in, N, out);
}
#endif
используя команду, предложенную в документации:
nvcc -std=c++11 -c -o cuda_op_kernel.cu.o cuda_op_kernel.cu.cc \
-I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
с $TF_INC
должным образом заменен путём включения тензорного потока. К сожалению, это приводит к множеству ошибок:
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1294): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1300): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1306): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1312): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1318): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1324): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1330): error: expression must have arithmetic, unscoped enum, or pointer type
/usr/lib/gcc/x86_64-linux-gnu/5/include/emmintrin.h(1336): error: expression must have arithmetic, unscoped enum, or pointer type
и еще много таких
Я обнаружил, что это может быть связано с неподдерживаемой комбинацией nvcc / gcc / os. Я не настраивал машину самостоятельно (и фактически не имею прав sudo). У меня nvcc версии 7.5.17, gcc версии 4.9.3 в Ubuntu 16.04.2. Ubuntu 16.04.2 НЕ указан в поддерживаемых системах для CUDA 7.5. Это может быть проблемой, но я обнаружил, что многие люди утверждают, что это работает 16.04. Кроме того, я успешно скомпилировал Tensorflow с поддержкой GPU на этой машине.
Кроме того, эти ошибки связаны с Тензор #include в коде и код успешно компилируется без этой строки. Я не пробовал, работает ли демонстрационный OP без этого включения, но мой собственный OP не удался с
2017-06-01 09:36:14.679685: E tensorflow/stream_executor/cuda/cuda_driver.cc:1067] could not synchronize on CUDA context: CUDA_ERROR_LAUNCH_FAILED :: No stack trace available
2017-06-01 09:36:14.679777: F tensorflow/core/common_runtime/gpu/gpu_util.cc:370] GPU sync failed
Два вопроса:
Хорошо, для тех, кто сталкивается с той же проблемой: вы можете установить компилятор хоста для nvcc
с использованием -ccbin
аргумент, как указано в этот ответ. Просто установите его gcc-4.9
,
Других решений пока нет …