you can use
for f in *.fa; do
myProgram (options) "./$f" "./$f.tmp" &
done
wait
which will run all your tasks in parallel, then wait until they all end before moving on. In the event that you have more jobs than cores, you should run all of them and let the OS scheduler worry about exchanging processes in out.
One of the modifications is the launch of 10 tasks at a time
count=0
for f in *.fa; do
myProgram (options) "./$f" "./$f.tmp" &
(( count ++ ))
if (( count = 10 )); then
wait
count=0
fi
done
, parallel, , , , 10 . wait , , - .