2012-03-17 22 views
8

Mặc dù tôi có một thẻ Fermi (GTX 560) Tôi nhận được lỗi này trên VS2010:CUDA 4.1 printf() Lỗi

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

Code:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

#include <stdio.h> 

__global__ void kernel() 
{ 
    printf("hello"); 
} 

int main() 
{ 
    kernel<<<1, 1>>>(); 
    return 0; 
} 

Tôi có thiếu cái gì ở đây?

Trả lời

13

Bạn cần đảm bảo rằng bạn đang biên dịch cho kiến ​​trúc chính xác. Chỉ các thẻ Fermi và Kepler (do đó khả năng tính toán 2.0, 2.1, 3.0 và 3.5 thiết bị) hỗ trợ printf trong hạt nhân. Nếu bạn biên dịch mã của bạn như thế này:

nvcc -arch=sm_21 [other options] ..... 

mã phải xây dựng chính xác. Kiến trúc mặc định là tính toán 1.0, đó là lý do tại sao bạn nhận được lỗi. Nếu bạn sử dụng Visual studio, sẽ có một tùy chọn dự án để chọn kiến ​​trúc đích, mặc dù tôi không thể cho bạn biết chính xác nơi để tìm thấy điều đó vì tôi không sử dụng nó với CUDA.

+2

Cảm ơn rất nhiều! Trong VS2010 tôi đã thay đổi Project -> {Project Name} Properties-> CUDA C/C++ -> Device -> [Code Generation]: compute_10, sm_10 thành compute_20, sm_20 và nó hoạt động. – dvgvrco

+0

Đối với thẻ của bạn, có lẽ bạn nên sử dụng sm_21, nhưng tôi không biết liệu nó có tạo ra sự khác biệt nhiều cho mã được phát ra bởi trình biên dịch hay không. – talonmies