#name shortcut type relop requestable consumable default urgency exclusive excl BOOL EXCL YES YES 0 1000
Unfortunately, I just discovered a slight deficiency with this approach. That complex must be attached to specific hosts. This means modifying each exec host using "qconf -me hostname".
ORIGINAL POST BELOW:
Here at Drexel's URCF, we use Univa Grid Engine (Wikipedia article). One of the requirements that frequently comes up is for jobs to have exclusive access to the compute hosts that the jobs occupy. A common reason is that a job may need more memory per process than is available on any single host.
Some resource managers and schedulers like Torque allow one to reserve nodes exclusively. In Grid Engine (GE), it is not a built-in feature. However, there is a way to accomplish the same thing. This post expands a little on Dan Gruber's blog post, for people like me who are new to GE.
Here, we assume there is only one queue named all.q. And we have two host groups: @intelhosts, and @amdhosts.
One can create a Boolean resource, a.k.a. complex, named "exclusive", which can be requested. That resource is forced to have the value TRUE in a new queue called exclusive.q so that only jobs that requests "exclusive" will be sent to that queue.
exclusive excl BOOL == FORCED NO 0 0
Once the complex is created, create a new queue named exclusive.q which spans all hosts, with a single slot per host. Set it to be subordinate to all.q -- this means that if there are any jobs in all.q on a host, exclusive.q on that host is suspended. And set the "exclusive" Boolean complex to be TRUE.
qname exclusive.q ... slots 1 subordinate_list all.q=1 complex_values exclusive=TRUE ...
Modify all.q and set it subordinate to exclusive.q -- this ensures that if there is a job in exclusive.q on a host, all.q on that host is suspended:
subordinate_list exclusive.q=1
And now, to get a parallel job on Intel hosts, the job script would have something like this:
#$ -l excl #$ -q *@@intelhosts #$ -pe mvapich 128