2010-06-03 31 views
12

Tôi đã tìm kiếm rộng rãi một giải pháp có thể cho lỗi của tôi trong 2 tuần qua. Tôi đã cài đặt thành công trình biên dịch (công cụ) và SDK Cuda 64 bit cũng như phiên bản 64-bit của Visual Studio Express 2008 và Windows 7 SDK với Framework 3.5. Tôi đang sử dụng Windows XP 64-bit. Tôi đã xác nhận rằng VSE có thể biên dịch trong 64-bit như tôi có tất cả các tùy chọn 64-bit có sẵn cho tôi bằng cách sử dụng các bước trên trang web sau: (kể từ khi Visual Express không bao gồm các gói 64 bit)Lỗi liên kết CUDA - Visual Express 2008 - nvcc gây tử vong do (null) tệp cấu hình

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

Cập nhật đăng ký để cài đặt 64 bit được tìm thấy trong nhận xét của người dùng trên cùng một trang như liên kết ở trên.

Tôi đã xác nhận khả năng biên dịch 64 bit vì "x64" có sẵn từ trình đơn kéo xuống trong "Tools-> Options-> VC++ Directories" và biên dịch trong 64 bit không dẫn đến toàn bộ dự án bị "bỏ qua". Tôi đã bao gồm tất cả các thư mục cần thiết cho các công cụ cuda 64 bit, 64 SDK và Visual Express (\ VC \ bin \ amd64).

Dưới đây là thông báo lỗi tôi nhận được khi cố gắng biên soạn trong 64-bit:

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

Dưới đây là mã đơn giản, tôi đang cố gắng để biên dịch/chạy trong 64-bit:

#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

Gợi ý bạn thêm câu trả lời của bạn như là một câu trả lời chính thức để câu hỏi này không xuất hiện trong danh sách "chưa được trả lời". Biên dịch với Express Edition trong 64 bit luôn là vấn đề, cảm ơn bạn đã chia sẻ điều này. – Tom

Trả lời

4

CẬP NHẬT 06/04/2010:

Ok, tôi đã tìm ra giải pháp cho vấn đề. Mã là tốt. Sau khi làm theo các bước từ liên kết gốc ở trên và thêm vào khóa đăng ký cần thiết, hãy đảm bảo rằng Windows SDK đang nhắm mục tiêu đúng phiên bản (7.0) bằng cách khởi chạy Windows SDK Configuration Tool từ trình đơn bắt đầu, chọn phiên bản phù hợp (v7.0), và nhấp vào "Tạo hiện tại".

Hãy chắc chắn bao gồm các thư mục sau đây cho x64 biên soạn (dưới "Tools-> Options-> Projects Và Giải pháp> VC++ Thư mục): C: \ CUDA \ bin64 C: \ CUDA \ lib64 C: \ CUDA \ include C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin \ amd64

Bây giờ có một thứ khác để thay đổi cho hệ thống 64 bit. Rõ ràng trình biên dịch cuda có "cứng" được mã hóa "thư mục cho trình biên dịch 64 bit trên Visual Express 2008. Để sửa lỗi, hãy sao chép tệp cần thiết" vcvars64.bat "và đổi tên thành" vcvarsamd64.bat "như sau:

C: \ P rogram 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

Khi thay đổi, chương trình được biên dịch và chạy thành công.

Tôi đã đọc các bài đăng 'khác' trên web để tìm các giải pháp khác cho lỗi: "nvcc gây tử vong: Tệp cấu hình Visual Studio '(null)'", nhưng rất ít đã chỉ định ở trên là yêu cầu để nhận nvcc để tìm tệp cấu hình studio trực quan cần thiết.

Tuyên bố từ chối trách nhiệm: Tôi đã cài đặt vào máy và hệ điều hành sạch.

Hy vọng điều này sẽ giúp những người khác có vấn đề tương tự.

1

Tôi thấy rằng tôi cũng phải thay đổi các biến môi trường CUDA_PATH và CUDA_LIB_PATH, vì chúng trỏ đến chuỗi công cụ x86 (mà tôi đã cài đặt sau các công cụ x64).

Sau khi một số faffing xung quanh với một số lỗi linker, tôi quản lý để xây dựng một ứng dụng C64 C64!

19

tôi giải quyết vấn đề bằng cách

  1. cài đặt Windows SDK (đừng quên để chọn tất cả các lựa chọn x64 cho hệ điều hành 64 bit)
  2. bao gồm "c: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 "trong PATH
  3. tạo tệp vcvars64.bat bên trong thư mục" c: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 "với nội dung sau: gọi" C: \ Program Files \ Microsoft SDK \ Windows \ v7.1 \ Bin \ SetEnv.cmd "/ x64

Lưu ý: Tôi đã làm vì đây:

  1. Tôi đang sử dụng VC++ tốc 2010
  2. Tôi không có "vcvars64.bat" trong bất kỳ thư mục ??
+2

Cái này hoạt động cho các cài đặt mới hơn của VC++ (Tôi đang sử dụng 2010), nơi các câu trả lời khác dành cho các phiên bản cũ hơn. – robbrit

+1

Khi tôi đọc điều này, tôi giống như 'vâng đúng, một anh chàng khác bắn đứt BS vì nó nghe hay đấy'. Thêm một tập tin .bat, gọi một lệnh khó hiểu - Tôi đã chờ đợi cho virus xuất hiện. Tuy nhiên, đáng kinh ngạc, NÀY LÀM VIỆC! 0 Lỗi xây dựng! TY amitabh! –

+0

Giải pháp tuyệt vời! – JackOLantern

3

Thông báo lỗi tương tự, nhưng lại có giải pháp khác. Tôi đã cố gắng để biên dịch 32 bit CUDA libs trên một máy 64bits. tôi đã có thêm --machine 32 lập luận để nvcc cuộc gọi, theo đề nghị của Imperian trong một chú thích, ở đây: Error compiling CUDA from Command Prompt

trong niềm hy vọng này sẽ giúp người

Các vấn đề liên quan