Bartosz Taudul
8fa5188176
Send delta times for context switches.
2019-10-25 19:13:11 +02:00
Bartosz Taudul
ba61a9ed84
Transfer time deltas, not absolute times.
...
This change significantly reduces network bandwidth requirements.
Implemented for:
- CPU zones,
- GPU zones,
- locks,
- plots,
- memory events.
2019-10-24 00:06:41 +02:00
Bartosz Taudul
cf88265304
Full 64-bit register is set by rdtsc.
2019-10-21 01:13:55 +02:00
Bartosz Taudul
c774534b47
Use rdtsc instead of rdtscp.
...
But rdtscp is serializing!
No, it's not. Quoting the Intel Instruction Set Reference:
"The RDTSCP instruction is not a serializing instruction, but it does
wait until all previous instructions have executed and all previous
loads are globally visible. But it does not wait for previous stores to
be globally visible, and subsequent instructions may begin execution
before the read operation is performed.",
"The RDTSC instruction is not a serializing instruction. It does not
necessarily wait until all previous instructions have been executed
before reading the counter. Similarly, subsequent instructions may begin
execution before the read operation is performed."
So, the difference is in waiting for prior instructions to finish
executing. Notice that even in the rdtscp case, execution of the
following instructions may commence before time measurement is finished
and data stores may be still pending.
But, you may say, Intel in its "How to Benchmark Code Execution Times"
document shows that using rdtscp is superior to rdstc. Well, not
exactly. What they do show is that when a *single function* is
considered, there are ways to measure its execution time with little to
no error.
This is not what Tracy is doing.
In our case there is no way to determine absolute "this is before" and
"this is after" points of a zone, as we probably already are inside
another zone. Stopping the CPU execution, so that a deeply nested zone
may be measured with great precision, will skew the measurements of all
parent zones.
And this is not what we want to measure, anyway. We are not interested
in how a *single function* behaves, but how a *whole program* behaves.
The out-of-order CPU behavior may influence the measurements? Good! We
are interested in that. We want to see *how* the code is really
executed. How is *stopping* the CPU to make a timer read an appropriate
thing to do, when we want to see how a program is performing?
At least that's the theory.
And besides all that, the profiling overhead is now reduced.
2019-10-20 20:52:33 +02:00
Bartosz Taudul
30fc2f02ab
Omit calculation of on-stack variable address.
2019-10-20 19:42:29 +02:00
Bartosz Taudul
7cf3608493
Avoid unused variables.
2019-10-05 02:11:45 +02:00
Bartosz Taudul
fe7f56b022
Implement retrieval of external process names.
2019-08-16 19:22:23 +02:00
Bartosz Taudul
69077e4e6f
Finish sending context switches during disconnect.
2019-08-14 23:06:13 +02:00
Bartosz Taudul
c0b524d8de
Add a separate method for clearing serial queue.
2019-08-14 22:39:12 +02:00
Bartosz Taudul
5fbb811f5d
Degrade ARM timer to monotonic raw clock.
...
The monotonic raw clock has the same accuracy as reading cntvct registers, but
using clock_gettime() has a measurable impact on queueing time (135 us vs
83 us).
This change is needed to enable ftrace time readings on ARM linux, which
doesn't provide any way to get raw cntvct readings, like x86-tsc on x86.
2019-08-14 16:19:02 +02:00
Bartosz Taudul
602c38c6c0
Allow checking timer implementation.
2019-08-14 14:35:44 +02:00
Bartosz Taudul
fe0f1aea07
Add system tracing skeleton.
2019-08-12 23:05:34 +02:00
Bartosz Taudul
8aa0be39d5
Drop support for CPU id queries.
2019-08-12 23:05:34 +02:00
Bartosz Taudul
0431c03556
Add serial queue interface.
2019-08-12 13:27:15 +02:00
Bartosz Taudul
12969ee497
Track thread context.
...
This change exploits the fact that events are processed in batches
originating from a single thread. A single message changing thread
context is enough to handle multiple messages, as opposed to inclusion
of thread identifier in each message.
2019-08-02 20:18:08 +02:00
Bartosz Taudul
a4e7a341c0
Proper handling of disconnect request.
2019-08-01 23:14:09 +02:00
Bartosz Taudul
a6a3f45810
Fill in thread id during dequeue, not during enqueue.
2019-07-30 01:15:14 +02:00
Bartosz Taudul
89928fde7b
Queue must be always able to alloc.
2019-07-29 22:13:16 +02:00
Bartosz Taudul
82a4a6d9cc
Add tracy_ prefix to concurrentqueue.h file name.
2019-07-29 21:47:50 +02:00
Alex
0c5ea710b0
Merged in z33ky/tracy/const-frame-image (pull request #37 )
...
Constify frame-image pointer in API.
2019-07-13 13:09:21 +00:00
Alexander 'z33ky' Hirsch
c6e8dc8d63
Constify frame-image pointer in API.
2019-07-13 12:33:55 +02:00
Bartosz Taudul
60d2384a6a
Allow sending application information messages.
2019-07-12 18:34:46 +02:00
Bartosz Taudul
bb35f9a897
Compress frame images in a separate thread.
2019-06-27 13:24:35 +02:00
Bartosz Taudul
7ebd2162c6
Add ETC1 compression thread.
2019-06-26 22:57:24 +02:00
Bartosz Taudul
f565e11976
Store frame images in queue.
2019-06-26 22:52:24 +02:00
Bartosz Taudul
8ce41b3543
Proper init order of thread local thread handle.
2019-06-26 19:32:52 +02:00
Bartosz Taudul
06a41708a7
Move TLS accesses close together.
2019-06-24 19:38:44 +02:00
Bartosz Taudul
0b394c3f53
Don't need to keep last broadcast time in Profiler class.
2019-06-18 20:15:09 +02:00
Bartosz Taudul
e609c0fdce
UDP broadcast loop.
2019-06-17 02:25:09 +02:00
Bartosz Taudul
37d1457b44
Frame image may need flipping.
2019-06-12 15:28:32 +02:00
Bartosz Taudul
04dd33f5c4
Fix mismatched linkage.
2019-06-11 23:51:12 +02:00
Rokas K. (rku)
c4e05b6264
Merged in rokups/tracy/dllimport-cleanup (pull request #36 )
...
Clean up imported functions in multi-dll projects.
Approved-by: Till Rathmann <till.rathmann@gmx.de>
2019-06-11 15:04:34 +00:00
Bartosz Taudul
80dff1ede1
Add connection id for on-demand mode.
...
Long-lived zones could send their end events without begin events in a
following scenario:
1. On-demand connection is made.
2. Zone begin is emitted, m_active is set to true.
3. Connection is terminated.
4. A new connection is made.
5. Zone end is emitted, because m_active is true.
To this point it was assumed that all zone end events will happen before
a new connection is made, but it's not necessarily true.
2019-06-09 17:15:47 +02:00
Bartosz Taudul
cc5bad294a
More strict memory ordering for on-demand connection status.
2019-06-09 16:48:00 +02:00
Bartosz Taudul
23e7850162
Make DequeueStatus enum class.
2019-06-09 16:14:30 +02:00
Bartosz Taudul
4c2ff80ac8
Restore frame counting for on-demand mode.
2019-06-09 15:23:01 +02:00
Bartosz Taudul
784c4da53a
Include frame offset in frame image message.
2019-06-07 20:09:29 +02:00
Rokas Kupstys
9bd1037347
Clean up imported functions in multi-dll projects.
2019-06-07 19:50:08 +03:00
Bartosz Taudul
d271634a95
Keep one ETC1 compression buffer.
2019-06-07 01:29:24 +02:00
Bartosz Taudul
a654b642ef
Compress frame images to ETC1 before sending.
2019-06-07 00:31:51 +02:00
Bartosz Taudul
e5bb6011c5
Frame image transfer prototype.
2019-06-06 21:39:54 +02:00
Bartosz Taudul
efc54babe3
Transfer of colored messages.
2019-05-10 20:17:44 +02:00
Bartosz Taudul
9ec8704dad
Don't include LZ4 headers in tracy headers.
...
The LZ4 implementation is wrapped in tracy namespace, but it also adds
some defines, which may conflict with other LZ4 implementations.
2019-05-01 12:57:42 +02:00
Bartosz Taudul
ec73178733
Move callstack cutting to a separate function.
2019-03-05 02:42:51 +01:00
Bartosz Taudul
e3c31e4a4e
Send callstack alloc payload.
2019-03-03 18:05:03 +01:00
Bartosz Taudul
d863245b49
Serialize discontinuous frame messages.
2019-02-28 19:21:23 +01:00
Bartosz Taudul
9f4f5bcb63
CPU usage retrieval.
2019-02-21 22:45:53 +01:00
Bartosz Taudul
44009b6fda
Use mach_absolute_time() to get time on iOS.
2019-02-21 14:45:13 +01:00
Bartosz Taudul
ef5e30056e
Implement delayed initialization of the profiler.
...
Enabled on osx, ios.
2019-02-19 20:43:30 +01:00
Bartosz Taudul
3f914834b7
Hide rest of statics.
2019-02-19 19:33:37 +01:00
Bartosz Taudul
9fabafbeca
Fix DLL code.
2019-02-19 18:46:59 +01:00
Bartosz Taudul
2421e05c27
Prevent direct access to s_profiler.
2019-02-19 18:38:08 +01:00
Bartosz Taudul
d865d1cc87
Disallow direct access to s_token.
2019-02-19 18:27:00 +01:00
Rokas Kupstys
8157e3a0b3
Fix builds with MingW.
2019-01-19 13:53:10 +02:00
Bartosz Taudul
970108fbbf
Track zone id for verification purposes.
2019-01-14 22:36:54 +01:00
Bartosz Taudul
1f0d1fdfdc
C API prototype.
2019-01-14 21:07:29 +01:00
Bartosz Taudul
070888f80d
Make it possible to have multiple vulkan contexts.
...
API change!
2019-01-10 17:11:17 +01:00
Bartosz Taudul
facb05f8cb
Don't mark FastVector element as used until it's ready.
...
This should prevent a race condition that would result in invalid last
element of the queue, in case a freezed thread already got the queue
item, but didn't wrote to it (or didn't wrote fully).
2018-08-20 22:35:50 +02:00
Bartosz Taudul
d1adf9e8d6
Allow skipping functions on top of call stack.
...
Note that this is on-client performance intensive and shouldn't be used,
except in special situations, like processing crashes.
2018-08-20 22:20:44 +02:00
Bartosz Taudul
b371003336
In case of manual shutdown, don't wait for lock.
...
All threads are freezed at this point, nothing will release it.
2018-08-20 21:49:23 +02:00
Bartosz Taudul
ca939ccd19
Allow external profiler shutdown requests.
2018-08-20 01:02:27 +02:00
Bartosz Taudul
9d051cf5ee
Add support for discontinuous frames.
2018-08-05 02:15:54 +02:00
Bartosz Taudul
adde6cf4fd
Allow sending named frames.
2018-08-04 15:04:18 +02:00
Bartosz Taudul
922882d3b0
Add name field to frame mark message.
2018-08-04 15:03:47 +02:00
Till Rathmann
37d5736bf5
Fixed compiler warnings.
2018-08-01 14:07:30 +02:00
Till Rathmann
dd042619e9
Support for multi-DLL projects.
2018-07-31 12:06:04 +02:00
Bartosz Taudul
31c2ddb8ac
Rename client's SourceLocation to SourceLocationData.
2018-07-28 00:34:04 +02:00
Bartosz Taudul
3737e122cf
Of course, this can't work without stupid fuckery.
2018-07-26 19:59:55 +02:00
Bartosz Taudul
561d2dc360
Use the fastest mutex available.
...
The selection is based on the following test results:
MSVC:
=== Lock test, 6 threads ===
=> NonRecursiveBenaphore
No contention: 11.641 ns/iter
2 thread contention: 141.559 ns/iter
3 thread contention: 242.733 ns/iter
4 thread contention: 409.807 ns/iter
5 thread contention: 561.544 ns/iter
6 thread contention: 785.845 ns/iter
=> std::mutex
No contention: 19.190 ns/iter
2 thread contention: 39.305 ns/iter
3 thread contention: 58.999 ns/iter
4 thread contention: 59.532 ns/iter
5 thread contention: 103.539 ns/iter
6 thread contention: 110.314 ns/iter
=> std::shared_timed_mutex
No contention: 45.487 ns/iter
2 thread contention: 96.351 ns/iter
3 thread contention: 142.871 ns/iter
4 thread contention: 184.999 ns/iter
5 thread contention: 336.608 ns/iter
6 thread contention: 542.551 ns/iter
=> std::shared_mutex
No contention: 10.861 ns/iter
2 thread contention: 17.495 ns/iter
3 thread contention: 31.126 ns/iter
4 thread contention: 40.468 ns/iter
5 thread contention: 15.677 ns/iter
6 thread contention: 64.505 ns/iter
Cygwin (clang):
=== Lock test, 6 threads ===
=> NonRecursiveBenaphore
No contention: 11.536 ns/iter
2 thread contention: 121.082 ns/iter
3 thread contention: 396.430 ns/iter
4 thread contention: 672.555 ns/iter
5 thread contention: 1327.761 ns/iter
6 thread contention: 14151.955 ns/iter
=> std::mutex
No contention: 62.583 ns/iter
2 thread contention: 3990.464 ns/iter
3 thread contention: 7161.189 ns/iter
4 thread contention: 9870.820 ns/iter
5 thread contention: 12355.178 ns/iter
6 thread contention: 14694.903 ns/iter
=> std::shared_timed_mutex
No contention: 91.687 ns/iter
2 thread contention: 1115.037 ns/iter
3 thread contention: 4183.792 ns/iter
4 thread contention: 15283.491 ns/iter
5 thread contention: 27812.477 ns/iter
6 thread contention: 35028.140 ns/iter
=> std::shared_mutex
No contention: 91.764 ns/iter
2 thread contention: 1051.826 ns/iter
3 thread contention: 5574.720 ns/iter
4 thread contention: 15721.416 ns/iter
5 thread contention: 27721.487 ns/iter
6 thread contention: 35420.404 ns/iter
Linux (x64):
=== Lock test, 6 threads ===
=> NonRecursiveBenaphore
No contention: 13.487 ns/iter
2 thread contention: 210.317 ns/iter
3 thread contention: 430.855 ns/iter
4 thread contention: 510.533 ns/iter
5 thread contention: 1003.609 ns/iter
6 thread contention: 1787.683 ns/iter
=> std::mutex
No contention: 12.403 ns/iter
2 thread contention: 157.122 ns/iter
3 thread contention: 186.791 ns/iter
4 thread contention: 265.073 ns/iter
5 thread contention: 283.778 ns/iter
6 thread contention: 270.687 ns/iter
=> std::shared_timed_mutex
No contention: 21.509 ns/iter
2 thread contention: 150.179 ns/iter
3 thread contention: 256.574 ns/iter
4 thread contention: 415.351 ns/iter
5 thread contention: 611.532 ns/iter
6 thread contention: 944.695 ns/iter
=> std::shared_mutex
No contention: 20.805 ns/iter
2 thread contention: 157.034 ns/iter
3 thread contention: 244.025 ns/iter
4 thread contention: 406.269 ns/iter
5 thread contention: 387.985 ns/iter
6 thread contention: 468.550 ns/iter
Linux (arm64):
=== Lock test, 6 threads ===
=> NonRecursiveBenaphore
No contention: 20.891 ns/iter
2 thread contention: 211.037 ns/iter
3 thread contention: 409.962 ns/iter
4 thread contention: 657.441 ns/iter
5 thread contention: 828.405 ns/iter
6 thread contention: 1131.827 ns/iter
=> std::mutex
No contention: 50.884 ns/iter
2 thread contention: 103.620 ns/iter
3 thread contention: 332.429 ns/iter
4 thread contention: 620.802 ns/iter
5 thread contention: 783.943 ns/iter
6 thread contention: 834.002 ns/iter
=> std::shared_timed_mutex
No contention: 64.948 ns/iter
2 thread contention: 173.191 ns/iter
3 thread contention: 490.352 ns/iter
4 thread contention: 660.668 ns/iter
5 thread contention: 1014.546 ns/iter
6 thread contention: 1451.553 ns/iter
=> std::shared_mutex
No contention: 64.521 ns/iter
2 thread contention: 195.222 ns/iter
3 thread contention: 490.819 ns/iter
4 thread contention: 654.786 ns/iter
5 thread contention: 955.759 ns/iter
6 thread contention: 1282.544 ns/iter
2018-07-14 00:39:01 +02:00
Bartosz Taudul
e285c837a4
Support TRACY_NO_EXIT env variable in addition to define.
2018-07-13 23:55:40 +02:00
Bartosz Taudul
c3ba0ef4eb
Fix lua zone state init.
2018-07-13 20:21:50 +02:00
Bartosz Taudul
a3c898f8b8
Rename FrameMark() to SendFrameMark().
...
This avoids conflict with FrameMark define.
2018-07-13 20:09:19 +02:00
Arvid Gerstmann
6b87aecdce
Wrap concurrentqueue in tracy namespace
2018-07-13 20:01:27 +02:00
Bartosz Taudul
fbc5556ddd
Send memory events in on-demand mode.
2018-07-12 01:36:01 +02:00
Bartosz Taudul
475d151b2d
Implement deferring items.
2018-07-11 12:21:39 +02:00
Bartosz Taudul
52207f20b7
Add deferred events queue.
2018-07-11 12:14:28 +02:00
Bartosz Taudul
b1a71174db
Messages are also safe.
2018-07-10 23:09:59 +02:00
Bartosz Taudul
e80c677fa0
Plots can be safely sent in on-demand mode.
2018-07-10 23:06:27 +02:00
Bartosz Taudul
43d5ab4382
Count frames in on-demand mode.
2018-07-10 22:27:19 +02:00
Bartosz Taudul
03794a2957
Send frame marks in on-demand mode.
2018-07-10 22:27:19 +02:00
Bartosz Taudul
f8b2ffdc7e
Clear queues before new on-demand connection is made.
2018-07-10 22:27:19 +02:00
Bartosz Taudul
c973735b49
Track connection status.
2018-07-10 22:27:19 +02:00
Bartosz Taudul
e5b133073c
Disable all tracing if TRACY_ON_DEMAND is defined.
2018-07-10 20:49:51 +02:00
Bartosz Taudul
4d197ec7a2
Unsafe version of AppendData.
2018-06-23 02:16:58 +02:00
Bartosz Taudul
f0ce7de193
Move callstack collection in mem events out of critical section.
2018-06-22 23:00:03 +02:00
Bartosz Taudul
b6088b908f
Callstack capture for ZoneBegin.
2018-06-22 00:56:30 +02:00
Bartosz Taudul
0c13fb818b
Initialize rpmalloc in Mem{Alloc,Free}Callstack().
...
rpmalloc may still be uninitialized here (i.e. if memory allocation/free
is performed before any other tracy operation that would initialize
thread_local data). Since memory allocations are using serialized queue
(which is not held in thread_local section) and obtaining callstack
involves memory allocation, we need to initialize rpmalloc manually.
This won't be a problem when support for zone callbacks becomes online,
because zones are stored in per-thread queues, which initialize
thread_local data before rpmalloc is needed in the Callstack() call.
2018-06-21 17:02:40 +02:00
Bartosz Taudul
909166daf7
Hide SendCallstackMemory().
2018-06-20 23:30:19 +02:00
Bartosz Taudul
8c46ad81d5
Extract common code.
2018-06-20 23:29:44 +02:00
Bartosz Taudul
5177a7b960
Callstack frame transfer.
2018-06-20 01:06:31 +02:00
Bartosz Taudul
9b1fb01e16
Disable Callstack() call if there's no callstack support.
2018-06-19 19:38:30 +02:00
Bartosz Taudul
51043ebc47
Callstack payload transfer.
2018-06-19 19:31:16 +02:00
Bartosz Taudul
55e6a4a484
No return status is needed here.
2018-06-19 19:00:57 +02:00
Bartosz Taudul
d0d3545988
Optional sending of callstack ptr in memory events.
2018-06-19 18:51:21 +02:00
Bartosz Taudul
9c11e0fc5b
Vulkan tracing.
2018-06-17 18:14:37 +02:00
Bartosz Taudul
5b6d9769af
Properly separate HW timer from MSVC rdtscp optimization.
2018-04-27 19:40:47 +02:00
Bartosz Taudul
237aee30a8
Test if HW timer can be used on arm.
2018-04-27 16:58:45 +02:00
Bartosz Taudul
6a2311a7b7
Arm64 also defines __ARM_ARCH.
2018-04-26 17:39:04 +02:00
Bartosz Taudul
a3f5003f88
Read time from timer register on armv6, armv7.
...
Same improvement as on aarch64.
2018-04-26 17:18:10 +02:00
Bartosz Taudul
69a50b04c1
Really don't care about cpu id.
2018-04-26 16:12:52 +02:00