1. A method of collecting data from a plurality of software threads being processed by a processor, the method comprising: collecting data for events occurring for each of the plurality of software threads wherein the data for each of the events includes a value of an associated clock cycle counter and wherein the data is collected upon occurrence of the event; and correlating the data for the events occurring for each of the plurality of software threads by one of: starting each of a plurality of clock cycle counters associated with the plurality of software threads at a common time; and logging a synchronizing event within each of the plurality of software threads upon occurrence of the synchronizing event.