2010-06-03 16 views
12

He estado buscando ampliamente una posible solución a mi error durante las últimas 2 semanas. He instalado con éxito el compilador de Cuda de 64 bits (herramientas) y SDK, así como la versión de 64 bits de Visual Studio Express 2008 y Windows 7 SDK con Framework 3.5. Estoy usando Windows XP de 64 bits. He confirmado que VSE puede compilar en 64 bits ya que tengo todas las opciones de 64 bits disponibles para mí usando los pasos en el siguiente sitio web: (ya que Visual Express no incluye inherentemente los paquetes de 64 bits)Error de enlace CUDA - Visual Express 2008 - nvcc fatal debido a un archivo de configuración (nulo)

http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/

Las actualizaciones de registro para la instalación de 64 bits se encuentran en un comentario del usuario en la misma página que el enlace anterior.

He confirmado la capacidad de compilación de 64 bits ya que "x64" está disponible desde el menú desplegable en "Herramientas-> Opciones-> Directorios VC++" y compilar en 64 bits no da como resultado todo el proyecto ser "saltado". He incluido todos los directorios necesarios para las herramientas de cuda de 64 bits, 64 SDK y Visual Express (\ VC \ bin \ amd64).

Aquí está el mensaje de error que recibo cuando se trata de compilar en 64 bits:

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 ========== 

Aquí está el código simple que estoy tratando de compilar/ejecutar en 64 bits:

#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

sugerimos que añada su respuesta como una respuesta oficial por lo que no aparece esta pregunta en la lista "sin respuesta". Compilar con Express Edition en 64 bits siempre es problemático, gracias por compartir esto. – Tom

Respuesta

4

ACTUALIZACIÓN 06/04/2010:

Bien, encontré la solución al problema. El código está bien. Después de seguir los pasos del enlace original anterior y agregar la clave de registro necesaria, asegúrese de que Windows SDK esté apuntando a la versión correcta (7.0) iniciando la Herramienta de configuración SDK de Windows desde el menú de inicio, elija la versión correcta (v7.0), y haz clic en "Hacer actual".

Asegúrese de incluir los siguientes directorios para x64 compilación (en "Herramientas-> Opciones-> Proyectos y Soluciones Directorios> VC++): C: \ CUDA \ bin64 C: \ CUDA \ lib64 C: \ CUDA \ include C: \ archivos de programa (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin \ amd64

Ahora hay otra cosa que cambiar para un sistema de 64 bits al parecer, el compilador CUDA tiene un "duro. codificado "directorio para compiladores de 64 bits en Visual Express 2008. Para realizar la corrección, copie el archivo" vcvars64.bat "necesario y cámbiele el nombre a" vcvarsamd64.bat "como se indica a continuación:

C: \ P rograma Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin \ vcvars64.bat

a

C: \ Archivos de programa (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin \ amd64 \ vcvarsamd64.bat

Tras el cambio, el programa se compiló y ejecutó correctamente.

He leído 'otras' publicaciones en la web sobre otras soluciones al error: "nvcc fatal: archivo de configuración de Visual Studio '(nulo)'", pero muy pocas han especificado lo anterior como requisito para obtener nvcc para encontrar el archivo de configuración de estudio visual necesario.

Descargo de responsabilidad: instalé en una máquina limpia y sistema operativo.

Esperemos que esto ayude a otros con problemas similares.

1

Descubrí que también tuve que cambiar las variables de entorno CUDA_PATH y CUDA_LIB_PATH porque apuntaban a la cadena de herramientas x86 (que había instalado después de las herramientas x64).

Después de algunos problemas con algunos errores del enlazador, ¡logré construir una aplicación CUDA x64!

19

me resolvió el problema

  1. la instalación de Windows SDK (no se olvide de elegir todas las opciones x64 para sistemas operativos de 64 bits)
  2. incluyen "c: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 "en RUTA
  3. crear el archivo vcvars64.bat dentro del directorio" c: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 "con el siguiente contenido: llamada" C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ SetEnv.cmd "/ x64

Nota: Hice esto porque:

  1. estoy usando VC++ Express 2010
  2. no tengo "vcvars64.bat" en cualquier directorio ??
+2

Éste funciona para instalaciones más nuevas de VC++ (estoy usando 2010) donde las otras respuestas son para versiones anteriores. – robbrit

+1

Cuando leí esto, estaba como 'Sí, cierto, otro tipo que emite BS porque suena bien'. Agregando un archivo .bat, llamando a un comando críptico - Esperaba que apareciera el virus. Sin embargo, sorprendentemente ¡ESTO FUNCIONÓ! 0 fallas de compilación! TY amitabh! –

+0

¡Excelente solución! – JackOLantern

3

Mismo mensaje de error, pero solución diferente una vez más. Intentaba compilar libs CUDA de 32 bits en una máquina de 64 bits. he tenido que añadir --machine 32 argumento para nvcc llamada, según lo sugerido por Imperano en un comentario, aquí: Error compiling CUDA from Command Prompt

en la esperanza que esto ayuda a alguien

Cuestiones relacionadas