Jos*_*osh 12 c++ windows-xp cuda linker-errors visual-c++
在过去的两周里,我一直在寻找可能的错误解决方案.我已经成功安装了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 ==========
Run Code Online (Sandbox Code Playgroud)
这是我尝试在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;
}
Run Code Online (Sandbox Code Playgroud)
小智 19
我解决了这个问题
注意:我这样做是因为:
2010 年 6 月 4 日更新:
好的,我找到了问题的解决方案。代码没问题。按照上面原始链接中的步骤操作并添加所需的注册表项后,通过从开始菜单启动 Windows SDK 配置工具,确保 Windows SDK 面向正确的版本 (7.0),选择正确的版本 (v7.0),并单击“设为当前”。
确保包含以下用于 x64 编译的目录(在“工具->选项->项目和解决方案->VC++ 目录”下): C:\CUDA\bin64 C:\CUDA\lib64 C:\CUDA\include C:\Program文件 (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 配置文件 '(null)'”,但很少有人将上述内容指定为让 nvcc 找到必要的Visual Studio配置文件。
免责声明:我安装到干净的机器和操作系统。
希望这可以帮助其他有类似问题的人。
| 归档时间: |
|
| 查看次数: |
17806 次 |
| 最近记录: |