# PROCESSES

Set to specify the number of processes spawned by a test, and the resources that they require. See hardware allocation for more information on how this property integrates into the CTest hardware allocation feature.

The `PROCESSES` property is a semicolon-separated list of process descriptions. Each process description consists of an optional number of processes for the description followed by a series of resource requirements for those processes. These requirements (and the number of processes) are separated by commas. The resource requirements consist of the name of a resource type, followed by a colon, followed by an unsigned integer specifying the number of slots required on one resource of the given type.

Please note that these processes are not spawned by CTest. The `PROCESSES` property merely tells CTest what processes the test expects to launch. It is up to the test itself to do this process spawning, and read the environment variables to determine which resources each process has been allocated.

Consider the following example:

    add_test(NAME MyTest COMMAND MyExe)
    set_property(TEST MyTest PROPERTY PROCESSES
      "2,gpus:2"
      "gpus:4,crypto_chips:2")

In this example, there are two process descriptions (implicitly separated by a semicolon.) The content of the first description is `2,gpus:2`. This description spawns 2 processes, each of which requires 2 slots from a single GPU. The content of the second description is `gpus:4,crypto_chips:2`. This description does not specify a process count, so a default of 1 is assumed. This single process requires 4 slots from a single GPU and 2 slots from a single cryptography chip. In total, 3 processes are spawned from this test, each with their own unique requirements.

When CTest sets the environment variables for a test, it assigns a process number based on the process description, starting at 0 on the left and the number of processes minus 1 on the right. For example, in the example above, the two processes in the first description would have IDs of 0 and 1, and the single process in the second description would have an ID of 2.

Both the `PROCESSES` and `RESOURCE_LOCK` properties serve similar purposes, but they are distinct and orthogonal. Resources specified by `PROCESSES` do not affect `RESOURCE_LOCK`, and vice versa. Whereas `RESOURCE_LOCK` is a simpler property that is used for locking one global resource, `PROCESSES` is a more advanced property that allows multiple tests to simultaneously use multiple resources of the same type, specifying their requirements in a fine-grained manner.