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

Posted

技术标签:

【中文标题】CUDA 链接错误 - Visual Express 2008 - 由于(空)配置文件导致 nvcc 致命【英文标题】:CUDA linking error - Visual Express 2008 - nvcc fatal due to (null) configuration file 【发布时间】:2011-02-27 13:38:42 【问题描述】:

在过去的 2 周里,我一直在广泛寻找可能的解决方案来解决我的错误。我已经成功安装了 Cuda 64 位编译器(工具)和 SDK 以及 64 位版本的 Visual Studio Express 2008 和带有 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 位编译能力,因为“x64”可从“工具->选项->VC++ 目录”下的下拉菜单中获得,并且以 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;

【问题讨论】:

建议您将您的答案添加为官方答案,这样该问题就不会出现在“未回答”列表中。使用 64 位 Express Edition 编译总是有问题,感谢分享。 【参考方案1】:

我解决了这个问题

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

注意:我这样做是因为:

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

【讨论】:

这个适用于较新的 VC++ 安装(我使用的是 2010),而其他答案适用于旧版本。 当我读到这篇文章时,我就像'是的,没错,另一个人因为听起来不错而大喊大叫'。添加一个 .bat 文件,调用一个神秘的命令——我在等待病毒出现。然而,令人惊讶的是,这行得通! 0 构建失败! TY 阿弥陀佛!【参考方案2】:

2010 年 6 月 4 日更新:

好的,我找到了问题的解决方案。代码很好。按照上面原始链接中的步骤并添加所需的注册表项后,通过从开始菜单启动 Windows SDK 配置工具,确保 Windows SDK 的目标是正确的版本(7.0),选择正确的版本(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 编译器在 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 致命:Visual Studio 配置文件 '(null)'”,但很少有人将上述内容指定为获取 nvcc 的要求找到必要的 Visual Studio 配置文件。

免责声明:我安装到干净的机器和操作系统上。

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

【讨论】:

【参考方案3】:

同样的错误信息,但又是不同的解决方案。我试图在 64 位机器上编译 32 位 CUDA 库。 正如 Imperian 在评论中所建议的那样,我必须在 nvcc 调用中添加 --machine 32 参数:Error compiling CUDA from Command Prompt

希望这对某人有所帮助

【讨论】:

【参考方案4】:

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

在解决了一些链接器错误之后,我设法构建了一个 x64 CUDA 应用程序!

【讨论】:

以上是关于CUDA 链接错误 - Visual Express 2008 - 由于(空)配置文件导致 nvcc 致命的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio Nsight“Cuda Toolkit V7.5 目录不存在”错误

CUDA 新版本 Visual Studio 和 CUDA 兼容性的小问题

visual studio 编译caffe 应用于python环境(无cuda)

Cuda Visual Profiler 未指定的启动失败

使用 Visual Studio 2010 express 编译 CUDA 示例

是否有可能使用团队资源管理器进行版本控制而无需为Visual Studio购买许可证?