Ошибка связывания CUDA - Visual Express 2008 - nvcc фатальный из-за (нулевого) файла конфигурации - PullRequest
12 голосов
/ 04 июня 2010

Последние 2 недели я интенсивно искал возможное решение моей ошибки. Я успешно установил 64-битный компилятор Cuda (инструменты) и SDK, а также 64-битную версию Visual Studio Express 2008 и Windows 7 SDK с Framework 3.5. Я использую 64-битную Windows XP. Я подтвердил, что 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» доступен из выпадающего меню в «Tools-> Options-> VC ++ Directoryies», а компиляция в 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;
}

Ответы [ 4 ]

19 голосов
/ 28 апреля 2011

Я решил проблему по

  1. установка Windows SDK (не забудьте выбрать все параметры x64 для 64-битной ОС)
  2. включает "c: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64" в PATH
  3. создайте файл vcvars64.bat внутри каталога "c: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64" со следующим содержимым: вызвать "C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ SetEnv.cmd" / x64

Примечание: я сделал это, потому что:

  1. Я использую VC ++ Express 2010
  2. У меня нет "vcvars64.bat" в любом каталоге ??
4 голосов
/ 07 июня 2010

ОБНОВЛЕНИЕ 06/04/2010:

Хорошо, я нашел решение проблемы. Код в порядке. Выполнив действия, описанные в исходной ссылке выше, и добавив необходимый раздел реестра, убедитесь, что Windows SDK нацелен на правильную версию (7.0), запустив средство настройки Windows SDK из меню «Пуск», выберите правильную версию (v7.0), и нажмите «Сделать текущим».

Убедитесь, что для компиляции x64 включены следующие каталоги (в «Сервис-> Параметры-> Проекты и решения-> Каталоги VC ++): 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 найти необходимый файл конфигурации visual studio.

Отказ от ответственности: я установил на чистую машину и ОС.

Надеюсь, это поможет другим с подобными проблемами.

3 голосов
/ 02 апреля 2012

То же сообщение об ошибке, но снова другое решение. Я пытался скомпилировать 32-битные библиотеки CUDA на 64-битной машине. Мне пришлось добавить --machine 32 аргумент к nvcc вызову, как предложено Imperian в комментарии, здесь: Ошибка компиляции CUDA из командной строки

в надежде, что это кому-то поможет

1 голос
/ 16 ноября 2010

Я обнаружил, что мне также пришлось изменить переменные среды CUDA_PATH и CUDA_LIB_PATH, потому что они указывали на цепочку инструментов x86 (которую я установил после инструментов x64).

После некоторых ошибок с компоновщиком мне удалось создать приложение x64 CUDA!

...