1. One or more non-transitory machine-readable storage media comprising a plurality of instructions stored thereon that, in response to execution by a computing device, cause the computing device to: generate a task data structure to store data related to a plurality of tasks of a program, the task data structure including at least one node corresponding to a task of the plurality of tasks, each node of the at least one node of the task data structure including a task identification number and a wait number; update the task data structure in response to spawning of a first task; update the wait number corresponding to the first task to the task identification number of a last descendant task of the first task that was executed and completed prior to a wait synchronization command; determine whether the first task has accessed a memory location previously accessed by a second task; and determine whether the first task can be executed in parallel with the second task using at least one of (i) the task identification number of the first task and (ii) the wait number of the first task, wherein the task identification number uniquely identifies the corresponding task from other currently executing tasks; and generate a parallelism report that indicates the first task can be executed in parallel with the second task in response to the determination that the first task can be executed in parallel with the second task.