9
votes

While compiling this hello world sample in Ubuntu 10.10

This is from CUDA by Example, chapter 3 (No compile instructions provided >:@)

#include <iostream>

__global__ void kernel (void){


}

int main(void){

    kernel <<<1,1>>>();
        printf("Hellow World!\n");
    return 0;

}

I got this:

$ nvcc -lcudart hello.cu hello.cu(11): error: identifier "printf" is undefined

1 error detected in the compilation of "/tmp/tmpxft_00007812_00000000-4_hello.cpp1.ii".

Why? How should this code be compiled?

2
@awoodland: Hmmmm, the second answer says it does, and indeed section B14 has "printf(“Hello thread %d, f=%f\n”, threadIdx.x, f);" - Kheldar
how is this supposed to be compiled then? - andandandand
the code stuff from that book are mere snippets if I recall correctly, and not always full examples. Not to mention they use alto of bad practise in those example.... - codingbunny

2 Answers

12
votes

You need to include stdio.h or cstdionot iostream (which is for std::cout stuff) for printf (see man 3 printf). I found the source code for the book here.

chapter03/hello_world.cu is actually:


/*
 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and 
 * proprietary rights in and to this software and related documentation. 
 * Any use, reproduction, disclosure, or distribution of this software 
 * and related documentation without an express license agreement from
 * NVIDIA Corporation is strictly prohibited.
 *
 * Please refer to the applicable NVIDIA end user license agreement (EULA) 
 * associated with this source code for terms and conditions that govern 
 * your use of this NVIDIA software.
 * 
 */


#include "../common/book.h"

int main( void ) {
    printf( "Hello, World!\n" );
    return 0;
}

Where ../common/book.h includes stdio.h.

The README.txt file details how to compile the examples:


The vast majority of these code examples can be compiled quite easily by using 
NVIDIA's CUDA compiler driver, nvcc. To compile a typical example, say 
"example.cu," you will simply need to execute:

> nvcc example.cu
2
votes

The issue is that the compiler does not know where to find printf function. It needs to know where to find it. The include directive is used to tell the compiler where to find it.

#include "stdio.h"

int main(void) {
  printf("Hello World!\n");
  return 0;
}

After the fix, it would work:

$ nvcc hello_world.cu
$ ls
a.out  hello_world.cu
$ a.out
Hello World!