CUDA链接错误 - Visual Express 2008 - nvcc致命错误,由于(空)配置文件。

12

过去两周我一直在寻找可能解决我的错误的办法。我已经成功安装了Cuda 64位编译器(工具)和SDK,以及Visual Studio Express 2008的64位版本和带有Framework 3.5的Windows 7 SDK。我使用的是Windows XP 64位系统。我确认VSE能够编译64位代码,因为我按照以下网站上的步骤获得了所有64位选项:(因为Visual Express本身不包含64位软件包)

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

64位安装的注册表更新可以在与上述链接相同页面的用户评论中找到。

我确认了64位编译功能,因为在“工具->选项->VC++目录”下拉菜单中“x64”可用,并且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
建议您将您的答案添加为官方答案,这样该问题就不会出现在“未回答”列表中。在64位Express版本中编译总是有问题的,感谢分享。 - Tom
4个回答

19

我通过以下方式解决了问题:

  1. 安装Windows SDK(不要忘记选择所有64位操作系统的x64选项)
  2. 在PATH中包含"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64"
  3. 在"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64"目录下创建vcvars64.bat文件,内容如下:
    call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64

注意:

  1. 我正在使用VC++ Express 2010
  2. 我在任何目录中都没有“vcvars64.bat”文件?

2
这个适用于较新版本的VC++(我使用的是2010),而其他答案适用于旧版本。 - robbrit
1
当我读到这个时,我就像“是啊,又一个人在胡说八道,因为听起来很好”。添加一个.bat文件,调用一个神秘的命令 - 我在等病毒出现。然而,令人惊讶的是,这个方法奏效了!0个构建失败!谢谢amitabh! - john k

5

更新于06/04/2010:

好的,我找到了解决问题的方法。代码没问题。在按照上面原始链接中的步骤并添加必要的注册表键后,请确保Windows SDK定位到正确的版本(7.0),通过从“开始”菜单启动Windows SDK配置工具、选择正确的版本(v7.0)并单击“设为当前”进行设置。

请确保在“工具->选项->项目和解决方案->VC++目录”下包含以下目录以进行x64编译:

C:\CUDA\bin64 C:\CUDA\lib64 C:\CUDA\include C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64

现在还有一件事要改变,针对64位系统。显然cuda编译器在Visual Express 2008上有一个“硬编码”的目录用于64位编译器。要进行修复,请将所需文件"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 configuration file '(null)'” 的'其他'帖子,但很少有人指定上述操作是获取nvcc找到必要的Visual Studio配置文件的要求。

声明:我将其安装在一个干净的机器和操作系统中。

希望这可以帮助遇到类似问题的其他人。


3

同样的错误信息,但是又有不同的解决方案。我试图在64位机器上编译32位CUDA库。

正如Imperian在这里的评论中建议的那样,我不得不在nvcc调用中添加--machine 32参数:Error compiling CUDA from Command Prompt

希望这能帮助到有需要的人。


1

我发现我还需要更改CUDA_PATH和CUDA_LIB_PATH环境变量,因为它们指向x86工具链(我在安装x64工具之后安装了它们)。

经过一些链接器错误的折腾,我成功地构建了一个x64 CUDA应用程序!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接