Hash :
8b1a84d9
Author :
Thomas de Grivel
Date :
2024-01-28T19:06:17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
# smallpt Makefile
#
#
# Select appropriate compiler.
#CPP=g++
CPP=g++-4.2
CPPFLAGS=-O3 -fopenmp # Use this for gcc >= 4.2
#CPPFLAGS=-O3 # Use this for gcc < 4.2
ifdef DEBUG
CPPFLAGS=-g
endif
default: all
all: smallpt smallpt4k
smallpt: smallpt.cpp Makefile
$(CPP) $(CPPFLAGS) -o smallpt smallpt.cpp
clean:
-rm smallpt smallpt4k
tkdiff:
for i in `svn st -q | cut -c 8-`; do tkdiff $$i; done
# Requires sstrip utility, which is part of ELFkickers:
# http://www.muppetlabs.com/~breadbox/software/elfkickers.html
# Also requires, 7z, part of p7zip:
# http://p7zip.sourceforge.net/
# The compile options were found with GC masher:
# http://ftp.kameli.net/pub/fit/misc/gcmasher11082005.tar.gz
# Guides I followed:
# http://in4k.untergrund.net/index.php?title=Linux
# http://ftp.kameli.net/pub/fit/misc/presis_asm06.pdf
# http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
#
# compiles to 4049 bytes on 32-bit kubuntu fiesty
# compiles to 4054 bytes on 64-bit kubuntu hardy (to a 32 bit binary)
smallpt4k: smallpt4k.cpp Makefile
$(CPP) -m32 -march=native -O1 -nostdlib -fpeephole2 -ftree-vectorize -fopenmp -ffast-math -fomit-frame-pointer -fno-exceptions -c smallpt4k.cpp
ld -dynamic-linker /lib/ld-linux.so.2 smallpt4k.o /usr/local/lib/libgomp.so /lib/libm.so.6 -o usmallpt4k # 32-bit OS
# ld -dynamic-linker /lib32/ld-linux.so.2 smallpt4k.o /usr/lib32/libgomp.so /lib32/libm.so.6 -o usmallpt4k -melf_i386 # 64-bit OS
strip -R .note -R .comment -R .eh_frame -R .eh_frame_hdr -R .gnu.version usmallpt4k
./sstrip usmallpt4k # 32-bit OS
# ./sstrip32 usmallpt4k # 64-bit OS
echo 'HOME=/tmp/S;cp $$0 ~;tail -n+2 $$0|zcat>~;~;rm ~;exit' > smallpt4k
7z a -tgzip -mx=9 -so dummy usmallpt4k >> smallpt4k
#gzip -n --best -c usmallpt4k >> smallpt4k
chmod +x smallpt4k
ls -l smallpt4k
# This builds a self assembling (SA) binary.
# File size is 2666 bytes (2.7KB) on 32-bit Ubuntu gutsy with g++ 4.2.
smallptSA: smallpt.cpp Makefile
echo 'a=/tmp/I;tail -n+2 $$0|zcat>$$a.cpp;g++-4.2 -O3 -fopenmp -o $$a $$a.cpp;$$a $$*;rm $$a $$a.cpp;exit' > smallptSA
7z a -tgzip -mx=9 -so dummy smallpt.cpp >> smallptSA
chmod +x smallptSA
ls -l smallptSA
DISTNAME = smallpt
DISTFILES = README LICENSE.txt smallpt.cpp smallpt4k.cpp Makefile result_25k.png
SRCS = $(CFILES) $(C++FILES) $(C++FILES:%.cxx=%.h)
SCENES=sky nightsky island vista overlap wada wada2 forest
SAMPLES=8 40 200 1000 5k 25k
IMAGES=$(SCENES:%=%.png) $(SCENES:%=%_t.jpg) $(SAMPLES:%=result_%.png) $(SAMPLES:%=result_t_%.jpg) $(SAMPLES:%=result_crop_%.jpg)
WEBFILES = $(DISTFILES) smallpt.txt smallpt4k.txt index.php cpp2html.css cpp2html_9.css result640.jpg smallpt.tar.gz top.html bot.html smallpt.html extraScenes.txt $(IMAGES)
results: smallpt smallpt4k
-mv result{,4k}_5k.ppm /tmp
-(time ./smallpt 5000 && mv image.ppm result_5k.ppm) 2>&1 |tee result.txt
-(time ./smallpt4k && mv image.ppm result4k_5k.ppm) 2>&1 |tee result4k.txt
-compare -metric AE result5k.ppm result_5k.png /tmp/garbage.ppm
-compare -metric AE result4k_5k.ppm result_5k.png /tmp/garbage.ppm
results2: smallpt smallpt4k
for i in $(SAMPLES); do \
(time ./smallpt $i && mv image.ppm image_$i.ppm) 2>&1 |tee result_$i.txt; \
compare -metric AE image_$i.ppm result_$i.png /tmp/diff_$i.png; \
done
dist: $(DISTFILES)
-rm -rf $(DISTNAME)
mkdir $(DISTNAME)
ln $(DISTFILES) $(DISTNAME)
tar cvzf $(DISTNAME).tar.gz $(DISTNAME)
chmod 644 $(DISTNAME).tar.gz
-rm -rf $(DISTNAME)
thumbs:
for i in $(SCENES); do \
convert "$${i}.ppm" "$${i}.png"; \
convert -quality 92 -resize 150x150 "$${i}.ppm" "$${i}_t.jpg"; \
done
errthumbs:
-for i in 8 40 200 1000 5k 25k; do \
convert "image_$${i}.ppm" -quality 92 "result_$${i}.png"; \
convert "image_$${i}.ppm" -resize 100x100 -quality 92 "result_t_$${i}.jpg"; \
convert "image_$${i}.ppm" -crop 100x100+205+530 -quality 92 "result_crop_$${i}.jpg"; \
done
-convert -resize 640x640 -quality 92 result_25k.png result640.jpg
upload: $(WEBFILES)
perl -pe 's/\n/ \n/g' smallpt.cpp >/tmp/tmp.smallpt.cpp
source-highlight -f html -c cpp2html.css --no-doc -n -i /tmp/tmp.smallpt.cpp -o /tmp/tmp.smallpt.html
./source-highlight-finish.pl < /tmp/tmp.smallpt.html > smallpt.html
convert -geometry 640x640 -quality 92 result_25k.png result640.jpg
rsync -e ssh -avz $(WEBFILES) kbeason@kevinbeason.com:kevinbeason.com/smallpt/
others:
$(CPP) $(CPPFLAGS)