mandelbrotset1 revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
#
# mandelbrotset1 - a simple mandelbrot set generation and
# parallel execution demo
#
function printmsg
{
print -u 2 "$@"
}
function fatal_error
{
print -u 2 "${progname}: $@"
exit 1
}
function print_color
{
print -n "${symbollist:${1}:1}"
}
function mandelbrot
{
float x=$1
float y=$2
float xx
float yy
float x1=$3
float y1=$4
integer iteration=$5
integer max_iteration=$6
float mag
done
print ${iteration}
return 0
}
function loop_serial
{
print_color $(mandelbrot ${x} ${y} ${x} ${y} 1 ${symbollistlen})
done
print
done
}
function loop_parallel
{
integer numjobs=0
# the following calculation suffers from rounding errors
printmsg "# lines_per_job=${lines_per_job}"
printmsg "# numcpus=${numcpus}"
# "renice" worker jobs
set -o bgnice
if [ "${TMPDIR}" = "" ] ; then
TMPDIR="/tmp"
fi
# try to generate a job identifer prefix which is unique across multiple hosts
printmsg $"## prepare..."
rm -f "${TMPDIR}/mandelbrot_${jobident}_child_$y.joboutput"
let numjobs++
done
printmsg $"## running ${numjobs} children..."
(
print_color $(mandelbrot ${x} ${y} ${x} ${y} 1 ${symbollistlen})
done
print
done >"${TMPDIR}/mandelbrot_${jobident}_child_$y.joboutput"
) &
done
printmsg $"## waiting for ${numjobs} children..."
wait
printmsg $"## output:"
rm "${TMPDIR}/mandelbrot_${jobident}_child_$y.joboutput"
done
}
function usage
{
OPTIND=0
exit 2
}
# main
builtin printf
builtin cat
builtin rm
builtin sleep
builtin uname # loop_parallel needs the ksh93 builtin version to generate unique job file names
float x_max
float x_min
float y_max
float y_min
float m_width
float m_height
float max_mag
float stepwidth
integer numcpus
# make sure ${COLUMN} and ${LINES} are set
eval $(resize -u)
symbollist=' .:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%#'
mode="parallel"
progname="${0}"
max_mag=400
stepwidth=0.1
numcpus=16
progname="${0}"
USAGE=$'
[-?
@(#)\$Id: mandelbrotset1 (Roland Mainz) 2007-06-05 \$
]
[+NAME?mandelbrotset1 - generate mandelbrot set fractals with ksh93]
[+DESCRIPTION?\bmandelbrotset1\b mandelbrot set fractal generator
which runs either in serial or parallel mode (using multiple worker jobs).]
[w:width?Width of fractal.]:[width]
[h:height?Height of fractal.]:[height]
[s:symbols?Symbols to build the fractal from.]:[symbolstring]
[m:mag?Magnification level.]:[magnificationlevel]
[p:stepwidth?Width per step.]:[widthperstep]
[S:serial?Run in serial mode.]
[P:parallel?Run in parallel mode.]
[M:mode?Execution mode.]:[mode]
[C:numcpus?Number of processors used for parallel execution.]:[numcpus]
[+SEE ALSO?\bjuliaset1\b(1), \bksh93\b(1)]
'
# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
s) symbollist="${OPTARG}" ;;
m) max_mag="${OPTARG}" ;;
p) stepwidth="${OPTARG}" ;;
S) mode="serial" ;;
P) mode="parallel" ;;
M) mode="${OPTARG}" ;;
C) numcpus="${OPTARG}" ;;
*) usage ;;
esac
done
shift ${OPTIND}-1
printmsg "# width=${m_width}"
printmsg "# height=${m_height}"
printmsg "# max_mag=${max_mag}"
printmsg "# stepwidth=${stepwidth}"
printmsg "# symbollist='${symbollist}'"
printmsg "# mode=${mode}"
serial) loop_serial ;;
*) fatal_error $"Unknown mode \"${mode}\"."
esac
# EOF.