2012-12-31 67 views
6

Tôi đang viết một chương trình cuda và cố gắng in một cái gì đó bên trong hạt nhân cuda bằng cách sử dụng chức năng printf. Nhưng khi tôi đang biên soạn chương trình sau đó tôi nhận được một lỗiin từ hạt nhân cuda

error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed 


error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include" -G --keep-dir "Debug" -maxrregcount=0 --machine 32 --compile -g -Xcompiler "/EHsc /nologo /Od /Zi /MDd " -o "Debug\test.cu.obj" "C:\Users\umdutta\Desktop\SANKHA_ALL_MATERIALS\PROGRAMMING_FOLDER\ABM_MODELLING_2D_3D\TRY_NUM_2\test_proj_test\test_proj\test_proj\test.cu"" exited with code 2. 

Tôi đang sử dụng ti thẻ GTX 560 có khả năng tính toán lớn hơn 2,0 và khi tôi đã tìm kiếm một chút thông tin về việc in ấn từ hạt nhân CUDA Tôi cũng thấy rằng tôi cần phải thay đổi trình biên dịch từ sm_10 sang sm_2.0 để tận dụng toàn bộ lợi thế của thẻ. Ngoài ra một số gợi ý cho cuPrintf để phục vụ mục đích. Tôi hơi bối rối những gì tôi nên làm và những gì nên là cách đơn giản nhất và nhanh nhất để có được bản in trên màn hình giao diện điều khiển của tôi. Nếu tôi cần thay đổi trình biên dịch nvcc từ 1.0 đến 2.0 thì tôi nên làm gì? Một điều nữa tôi muốn đề cập đến rằng tôi đang sử dụng Windows 7.0 và lập trình trong studio trực quan 2010. Cảm ơn tất cả sự giúp đỡ của bạn.

+0

nó nên làm việc nếu (1) bạn biên dịch cho sm_21 kiến ​​trúc đích và (2) đảm bảo '#include stdio.h'. Thời gian chạy CUDA bao gồm quá tải thiết bị của printf cho hạt nhân, nhưng thư viện I/O stardard C phải được bao gồm một cách rõ ràng cho cơ chế này hoạt động. – talonmies

+0

HI! Tệp tiêu đề i/o tiêu chuẩn luôn được bao gồm và khả năng tính toán của thẻ của tôi là 2.1. Vì vậy, tôi nghĩ rằng nó nên được biên dịch với các tính năng sm_21 của trình biên dịch nvcc. Tuy nhiên tôi đã giải quyết được vấn đề của mình bằng cách sử dụng hàm cuPrintf. Nhưng tôi vẫn muốn biết làm thế nào tôi có thể thay đổi khả năng tính toán nvcc 1.0 mặc định của tôi thành 2.1 khả năng tính toán. – duttasankha

+0

@RogerDahl: Điều đó hoàn hảo và hoạt động hoàn hảo. Bạn có thể chỉ gửi cho bạn câu trả lời để tôi có thể chấp nhận nó không. Bạn đã làm cho ngày của tôi. Cảm ơn một tấn. – duttasankha

Trả lời

8

Để cho phép sử dụng đồng bằng printf() trên thiết bị có khả năng tính toán> = 2.0, điều quan trọng là phải biên dịch CC ít nhất CC 2.0 và vô hiệu hóa mặc định, bao gồm bản dựng cho CC 1.0.

Nhấp chuột phải vào tệp .cu trong dự án của bạn, chọn Properties, chọn Configuration Properties | CUDA C/C++ | Device. Nhấp vào dòng Code Generation, nhấp vào hình tam giác, chọn Edit. Trong hộp thoại Tạo mã, bỏ chọn Inherit from parent or project defaults, nhập compute_20,sm_20 trong cửa sổ trên cùng, nhấp vào OK.

+0

Không hoạt động. Vẫn than phiền về printf là không xác định. Mỏ là CUDA 6.5 + VS2012 + Tesla2050 – Ono

6

Một cách để giải quyết vấn đề này là sử dụng chức năng cuPrintf có khả năng in từ hạt nhân. Sao chép các tập tin cuPrintf.cucuPrintf.cuh từ thư mục

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\simplePrintf 

vào thư mục của dự án. Sau đó, thêm tệp tiêu đề cuPrintf.cuh vào dự án của bạn và thêm

#include "cuPrintf.cu" 

vào mã của bạn. Sau đó, mã của bạn phải được viết theo định dạng được đề cập bên dưới:

#include “cuPrintf.cu” 
__global__ void testKernel(int val) 
{ 
    cuPrintf(“Value is: %d\n”, val); 
} 

int main() 
{ 
    cudaPrintfInit(); 
    testKernel<<< 2, 3 >>>(10); 
    cudaPrintfDisplay(stdout, true); 
    cudaPrintfEnd(); 
    return 0; 
} 

Bằng cách làm theo quy trình trên, bạn có thể in trên cửa sổ bảng điều khiển từ chức năng thiết bị. Mặc dù tôi đã giải quyết được các vấn đề của mình theo cách đã đề cập ở trên nhưng tôi vẫn không có giải pháp sử dụng printf từ chức năng thiết bị. Nếu nó là sự thật và hoàn toàn cần thiết để nâng cấp trình biên dịch nvcc của tôi từ sm_10 lên sm_21 để kích hoạt tính năng printf thì sẽ rất hữu ích nếu ai đó có thể chỉ cho tôi ánh sáng. Cảm ơn tất cả sự hợp tác của bạn

3

bạn có thể viết mã này để in bất cứ điều gì bạn muốn từ bên trong CUDA Kernel:

# if __CUDA_ARCH__>=200 
    printf("%d \n", tid); 

#endif 

và bao gồm < stdio.h>

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