The Game of Life in CUDA

OOh, nice one - even runs quite well on my laptop ( with 9300m )

I’ve spent some time optimizing the code and to my surprise it is mostly the display updates that consume a lot of time.

(gtx 260)

I don’t know what optimizations you did, but i got the kernel down to half a milisecond. for a 1024x1024 on a quadro 5800. but just coping the data back takes 3 miliseconds, and rendering … of course using gl interop and vbo rendering will speed stuff up. Oh and in my version the boarders loop around so that what ever goes out the bottem come back from the top and so forth.

down to half a millisecond? how much time was it before? :D

go fourth with the optimisation, and give us some code :D

i tryed to make it looping too…but…damn…for any reason it does not work…

ill post the new code soon, any ways one thing is that you need to switch the buffers for each run, the last out is now the in and the last in is now the out … hope this helps

erdooom

with your optimisation are you guaranteeing coalesced memory accesses?

nope not really, even if we find a way to do that (which is very tricky on the border cells of a block since they need to read data that belongs to the next block) it would completely screw over the memory reads for the gl draw. but half a millisecond is pretty good. using gl inter-op would give it a much bigger performance boost. I did move to using the shared memory which improved the time from 0.8 ms to 0.5 …

How to get this compiled on Mac OS X ?

EDIT: DONE :)

I get 6 FPS CPU (C2D 2.8 GHz) and 28 FPS GPU (8800)

(Noob in CUDA programming, new here…)

Well i have a similar problem

I have a project to make :

Write a program in CUDA simulating GAME OF LIFE with the following requirements:

Inputs: 1) number of iterations, t
2) file which contains the starting board (nXn)

Actions: 1) Read the starting board
2) do t iterations
3) Write the final board (nxn) in a new file (to be able to use it as input later)
The calculation-development must use the GPU

Notes: In calculations you must use cyclic boundary conditions (the next cell of n-1 cell is 0 cell, and reverse)
Your program must be able to run successfully using boards (nxn) with n<= 2000 and use Shared memory


Any kind of help appreciated

At the moment trying to work on the given code(attached by erdooom and Snowball_Two) so solutions on it will be preferred

so you preaty much have it all done, all u need is to read the file and write it.

Can someone help me out a little bit? I couldn’t understand whether the automaton’s boundaries were cyclical or not. The Neighbors function got me a little confused. In a previous implementation of Game of Life I had written in C# I had used a a 2d array.

NOTE: I am referring to the code that SNOWBALL TWO posted

I think in snowball two’s code there is no cyclic boundary thing … and in the Dev_Neighbors() , function from conditions like (x+i<SCREENX) && (y+k<SCREENY) i think when it coming to boundaries it doesn’t bother calculating …

Well i’m a little bit confused…

I have to run my project in a UI (linux-based).

In this UI all the appropriate files and libs in order to run CUDA progs are preinstalled.

so i uploaded my project GoL_perfect.cu(FYI is the exact code uploaded here from erdooom and Snowball_Two)

and tried to compile it but there were lots of errors (concerning mainly OpenGL in some cases)

the command i used was

nvcc -I/usr/local/NVIDIA_CUDA_SDK_2.3/C/common/inc -o test GoL_perfect.cu -L/usr/local/NVIDIA_CUDA_SDK_2.3/C/common/lib -lglut

but i got

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_menu.o): In function `fgDisplayMenu':

(.text+0x12ad): undefined reference to `glMatrixMode'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_menu.o): In function `fgDisplayMenu':

(.text+0x12b2): undefined reference to `glPopMatrix'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_state.o): In function `fghGetConfig':

(.text+0x2db): undefined reference to `glXGetConfig'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_state.o): In function `glutGet':

(.text+0x3dd): undefined reference to `XGetWindowAttributes'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_state.o): In function `glutGet':

(.text+0x480): undefined reference to `XTranslateCoordinates'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_state.o): In function `glutGet':

(.text+0x4c7): undefined reference to `XTranslateCoordinates'

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libglut.a(libglut_la-freeglut_window.o): In function `glutFullScreen':

… and More

trying with glut32

$ nvcc -I/usr/local/NVIDIA_CUDA_SDK_2.3/C/common/inc -o test GoL_perfect.cu -L/usr/local/NVIDIA_CUDA_SDK_2.3/C/common/lib/glut32

/tmp/tmpxft_00000867_00000000-11_GoL_perfect.o: In function `computeFPS()':

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x422): undefined reference to `cutGetTimerValue'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x46f): undefined reference to `glutSetWindowTitle'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x484): undefined reference to `cutResetTimer'

/tmp/tmpxft_00000867_00000000-11_GoL_perfect.o: In function `display()':

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x6a9): undefined reference to `cutStartTimer'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x6c4): undefined reference to `glMatrixMode'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x6c9): undefined reference to `glLoadIdentity'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x6fc): undefined reference to `gluOrtho2D'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x706): undefined reference to `glClear'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x710): undefined reference to `glMatrixMode'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x715): undefined reference to `glLoadIdentity'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x827): undefined reference to `glFlush'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x869): undefined reference to `cutStopTimer'

/tmp/tmpxft_00000867_00000000-11_GoL_perfect.o: In function `main':

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0x9a1): undefined reference to `cutGetCmdLineArgumentstr'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xa28): undefined reference to `cutCreateTimer'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xa4c): undefined reference to `glutInit'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xa56): undefined reference to `glutInitDisplayMode'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xa65): undefined reference to `glutInitWindowSize'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xa6f): undefined reference to `glutCreateWindow'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xafe): undefined reference to `glutMainLoop'

tmpxft_00000867_00000000-10_GoL_perfect.ii:(.text+0xb09): undefined reference to `cutDeleteTimer'

collect2: ld returned 1 exit status

(the above are just small parts of the actual error messages)

so i am wondering :

Which is the exact command to compile my project properly?

It is required to compile and run it on this UI

connecting using PuttY

PS:i am assuming that the problem is with the code line #include <GL/glut.h>

but when i include the folder “inc” and the folder “GL” is its subfolder doesnt mean that all should be ok?(and compiler should recongnize glut.h)

-L path for glut must be added to command line?

This is my makefile which I mostly use this might help you. :rolleyes:

[codebox]SDK_ROOT = /home/bibrak/NVIDIA_GPU_Computing_SDK

CUDA_LIB_PATH = /usr/local/cuda/lib

INLCUDE = -I$(SDK_ROOT)/C/common/inc -I/usr/local/cuda/include

LIBS = -L$(SDK_ROOT)/C/lib -lcutil -lglut

LIBS += -L$(CUDA_LIB_PATH) -lcudart -lcuda

SRC_CU = GoL.cu

SRC_CXX =

all:

nvcc $(INLCUDE) $(LIBS) $(SRC_CU) $(SRC_CXX)[/codebox]

[b]

remember there is a tab before nvcc[/b]

BTW, are you running the GUI through PUTTY ?

I run GUI of a remote linux machine through

ssh -X user@address

i am not sure, if there is a way to doing it on PUTTY.

there is…

My professor who owns the linux server told us to run the project there.

so i am connecting to my UI through Putty (which is ussing ssh btw)

anyway

the only info that he gave to me is to install from /root directory the CUDA SDK 2.3 installer into my home directory…

but in the /root directory i only found NVIDIA_CUDA_SDK_2.02.0807.1535_linux.run

so i installed it in ~/NVIDIA_CUDA_SDK folder. Installation seems to ended ok but when i tried to modify the .bash_profile following

nvidia’s README about linux(and taken as granted that drivers and toolkit were already installed by my professor)

i change it and it looks like

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

		. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/cuda/bin:~/NVIDIA_CUDA_SDK/bin

export PATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib:~/NVIDIA_CUDA_SDK/lib

export LD_LIBRARY_PATH

but when i go further to building the project examples i get errors

/usr/bin/ld: cannot find -lcudart

collect2: ld returned 1 exit status

make[1]: *** [../../bin/linux/release/quasirandomGenerator] Error 1

make[1]: Leaving directory `/export/home/username/NVIDIA_CUDA_SDK/projects/quasirandomGenerator'

make: *** [projects/quasirandomGenerator/Makefile.ph_build] Error 2

so smthn is wrong…

bibrak@bibrak-laptop:/usr/local/cuda/lib$ ls
libcublasemu.so libcublas.so.2 libcudart.so.2.3 libcufft.so
libcublasemu.so.2 libcublas.so.2.3 libcufftemu.so libcufft.so.2
libcublasemu.so.2.3 libcudart.so libcufftemu.so.2 libcufft.so.2.3
libcublas.so libcudart.so.2 libcufftemu.so.2.3

check for the libcudart.so
if its there then check your compilation command does it include -lcudart

some thing like

nvcc program.cu -lcudart

hi all…

I have implemented a different kernel of the Game of Life.

please look at it, and comment on, "Does it make COALESCED memory accesses ? "

biebo

path /usr/local/cuda/lib

libcublasemu.so libcublas.so.2 libcudart.so.2.3 libcufft.so

libcublasemu.so.2 libcublas.so.2.3 libcufftemu.so libcufft.so.2

libcublasemu.so.2.3 libcudart.so libcufftemu.so.2 libcufft.so.2.3

libcublas.so libcudart.so.2 libcufftemu.so.2.3

path /usr/local/cuda/lib64

libcublasemu.so libcublas.so.2 libcudart.so.2.3 libcufft.so

libcublasemu.so.2 libcublas.so.2.3 libcufftemu.so libcufft.so.2

libcublasemu.so.2.3 libcudart.so libcufftemu.so.2 libcufft.so.2.3

libcublas.so libcudart.so.2 libcufftemu.so.2.3

path /usr/local/cuda/bin

bin2c cudafe++ filehash nvcc.profile ptxvars.cu

cudafe fatbin nvcc ptxas

with the command nvcc -o test1 GoL_perfect.cu -lGL -lglut -lcudart

i get

/tmp/tmpxft_00000332_00000000-11_GoL_perfect.o: In function `computeFPS()':

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x422): undefined reference to `cutGetTimerValue'

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x484): undefined reference to `cutResetTimer'

/tmp/tmpxft_00000332_00000000-11_GoL_perfect.o: In function `display()':

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x6a9): undefined reference to `cutStartTimer'

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x6fc): undefined reference to `gluOrtho2D'

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x869): undefined reference to `cutStopTimer'

/tmp/tmpxft_00000332_00000000-11_GoL_perfect.o: In function `main':

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0x9a1): undefined reference to `cutGetCmdLineArgumentstr'

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0xa28): undefined reference to `cutCreateTimer'

tmpxft_00000332_00000000-10_GoL_perfect.ii:(.text+0xb09): undefined reference to `cutDeleteTimer'

collect2: ld returned 1 exit status

try adding -lcutil