Ошибка связывания CUDA - Visual Express 2008 - nvcc фатальный из-за (нулевого) файла конфигурации
Я много раз искал возможное решение моей ошибки за последние 2 недели. Я успешно установил 64-разрядный компилятор Cuda (инструменты) и SDK, а также 64-разрядную версию Visual Studio Express 2008 и Windows 7 SDK с Framework 3.5. Я использую Windows XP 64-bit. Я подтвердил, что VSE может скомпилировать в 64-разрядной версии, поскольку у меня есть все доступные мне 64-битные опции, используя шаги на следующем веб-сайте: (поскольку Visual Express по сути не включает 64-разрядные пакеты)
http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/
Обновления реестра для 64-разрядной установки находятся в комментарии пользователя на той же странице, что и указанная выше ссылка.
Я подтвердил 64-битную компиляцию, так как "x64" доступен из выпадающего меню в разделе "Инструменты- > Параметры- > VС++-каталоги", а компиляция в 64-разрядном режиме не приводит к тому, что весь проект будет "пропускаются". Я включил все необходимые каталоги для 64-битных инструментов cuda, 64 SDK и Visual Express (\ VC\bin\amd64).
Вот сообщение об ошибке, которое я получаю при попытке скомпилировать в 64-разрядной версии:
1>------ Build started: Project: New, Configuration: Release x64 ------
1>Compiling with CUDA Build Rule...
1>"C:\CUDA\bin64\nvcc.exe" -arch sm_10 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MT " -maxrregcount=32 --compile -o "x64\Release\template.cu.obj" "c:\Documents and Settings\All Users\Application Data\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\src\CUDA_Walkthrough_DeviceKernels\template.cu"
1>nvcc fatal : Visual Studio configuration file '(null)' could not be found for installation at 'C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/../..'
1>Linking...
1>LINK : fatal error LNK1181: cannot open input file '.\x64\Release\template.cu.obj'
1>Build log was saved at "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\New\New\x64\Release\BuildLog.htm"
1>New - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Вот простой код, который я пытаюсь скомпилировать/запустить в 64-разрядной версии:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <cuda.h>
void mypause ()
{
printf ( "Press [Enter] to continue . . ." );
fflush ( stdout );
getchar();
}
__global__ void VecAdd1_Kernel(float* A, float* B, float* C, int N)
{
int i = blockDim.x*blockIdx.x+threadIdx.x;
if (i<N)
C[i] = A[i] + B[i]; //result should be a 16x1 array of 250s
}
__global__ void VecAdd2_Kernel(float* B, float* C, int N)
{
int i = blockDim.x*blockIdx.x+threadIdx.x;
if (i<N)
C[i] = C[i] + B[i]; //result should be a 16x1 array of 400s
}
int main()
{
int N = 16;
float A[16];float B[16];
size_t size = N*sizeof(float);
for(int i=0; i<N; i++)
{
A[i] = 100.0;
B[i] = 150.0;
}
// Allocate input vectors h_A and h_B in host memory
float* h_A = (float*)malloc(size);
float* h_B = (float*)malloc(size);
float* h_C = (float*)malloc(size);
//Initialize Input Vectors
memset(h_A,0,size);memset(h_B,0,size);
h_A = A;h_B = B;
printf("SUM = %f\n",A[1]+B[1]); //simple check for initialization
//Allocate vectors in device memory
float* d_A;
cudaMalloc((void**)&d_A,size);
float* d_B;
cudaMalloc((void**)&d_B,size);
float* d_C;
cudaMalloc((void**)&d_C,size);
//Copy vectors from host memory to device memory
cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);
cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);
//Invoke kernel
int threadsPerBlock = 256;
int blocksPerGrid = (N+threadsPerBlock-1)/threadsPerBlock;
VecAdd1(blocksPerGrid, threadsPerBlock,d_A,d_B,d_C,N);
VecAdd2(blocksPerGrid, threadsPerBlock,d_B,d_C,N);
//Copy results from device memory to host memory
//h_C contains the result in host memory
cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);
for(int i=0; i<N; i++) //output result from the kernel "VecAdd"
{
printf("%f ", h_C[i] );
printf("\n");
}
printf("\n");
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
mypause();
return 0;
}
Ответы
Ответ 1
Я решил проблему с помощью
- установка Windows SDK (не забудьте выбрать все опции x64 для 64-разрядной ОС)
- включить "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64" в PATH
- создать файл vcvars64.bat внутри каталога "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64" со следующим содержимым:
вызов "C:\Program Files\Microsoft SDK\Windows\v7.1\Bin\SetEnv.cmd" /x 64
Примечание. Я сделал это, потому что:
- Я использую VС++ Express 2010
- У меня нет "vcvars64.bat" в любом каталоге?
Ответ 2
ОБНОВЛЕНИЕ 06/04/2010:
Хорошо, я нашел решение проблемы. Код в порядке. После выполнения шагов из исходной ссылки выше и добавления в необходимый раздел реестра убедитесь, что Windows SDK нацеливается на правильную версию (7.0), запустив инструмент настройки SDK Windows из меню "Пуск", выберите правильную версию (v7.0), и нажмите "Сделать ток".
Обязательно включите следующие каталоги для компиляции x64 (в разделе "Инструменты- > Параметры- > Проекты и решения- > Каталоги VС++):
C:\CUDA\bin64
C:\CUDA\lib64
C:\CUDA\включают
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64
Теперь есть еще одна вещь для изменения для 64-битной системы. По-видимому, компилятор cuda имеет "жестко закодированный" каталог для 64-битных компиляторов в Visual Express 2008. Чтобы исправить, скопируйте нужный файл "vcvars64.bat" и переименуйте его в "vcvarsamd64.bat" следующим образом:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat
к
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat
После изменения программа скомпилирована и успешно выполнена.
Я читал "другие" публикации по всему миру для других решений ошибки: "nvcc fatal: файл конфигурации Visual Studio" (null) ", но очень немногие указали выше, как требование получить nvcc чтобы найти необходимый файл конфигурации визуальной студии.
Отказ от ответственности: я установил на чистую машину и ОС.
Надеюсь, это поможет другим с подобными проблемами.
Ответ 3
Такое же сообщение об ошибке, но другое решение еще раз. Я пытался скомпилировать 32-битные CUDA-библиотеки на 64-битной машине.
Я должен был добавить аргумент --machine 32
к вызову nvcc
, как предложил Imperian в комментарии, здесь: Ошибка компиляции CUDA из командной строки
в надежде, что это поможет кому-то
Ответ 4
Я обнаружил, что мне также пришлось изменить переменные среды CUDA_PATH и CUDA_LIB_PATH, поскольку они указывали на инструментальную цепочку x86 (которую я установил после инструментов x64).
После некоторого оцепенения с некоторыми ошибками компоновщика мне удалось создать приложение C64 для x64!