Skip to content

Commit a294dd8

Browse files
FindHaometa-codesync[bot]
authored andcommitted
Make zstd compression level configurable via environment variable (#88)
Summary: Add `CUTRACER_ZSTD_LEVEL` environment variable to configure zstd compression level (1-22). This allows users to trade off compression speed vs compression ratio based on their use case. ## Changes - `include/env_config.h`: Add extern declaration for `zstd_compression_level` - `src/env_config.cu`: Add environment variable reading logic with validation (range 1-22) - `src/trace_writer.cpp`: Use configurable compression level instead of hardcoded value 22 - `readme.md`: Document new `CUTRACER_ZSTD_LEVEL` environment variable ## Configuration `CUTRACER_ZSTD_LEVEL`: Zstd compression level (1-22, default 22) - Lower values (1-3): Faster compression, slightly larger output - Higher values (19-22): Maximum compression, slower but smallest output - Default of 22 provides maximum compression for smallest output ## Motivation The default compression level of 22 (maximum) prioritizes compression ratio over speed. For use cases where compression speed is more important, users can set a lower level (e.g., 3) to get nearly the same compression ratio with significantly faster compression. This change allows users to choose the trade-off that best suits their workflow. ## Example Usage ```bash # Fast compression (level 1) CUTRACER_ZSTD_LEVEL=1 CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app # Maximum compression (level 22, default) CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app # Balanced compression (level 9) CUTRACER_ZSTD_LEVEL=9 CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app ``` Pull Request resolved: #88 Test Plan: 1. Build CUTracer: `make -j$(nproc)` 2. Verify default level works: Run with `TRACE_FORMAT_NDJSON=1` and check output 3. Verify custom level: Set `CUTRACER_ZSTD_LEVEL=1` and verify faster compression 4. Verify validation: Set invalid value (e.g., 25) and verify warning + fallback to default Reviewed By: dshi7 Differential Revision: D89703353 Pulled By: FindHao fbshipit-source-id: d8f9624c7c1b972c43972df678b513f73e69a664
1 parent 837eab6 commit a294dd8

6 files changed

Lines changed: 65 additions & 2 deletions

File tree

include/env_config.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,7 @@ void init_analysis(const std::string& analysis_str);
7272
// 1 = NDJSON+Zstd (compressed JSON)
7373
// 2 = NDJSON only (uncompressed JSON, good for debugging)
7474
extern int trace_format_ndjson;
75+
76+
// Zstd compression level (1-22, higher = better compression but slower)
77+
// Default: 9 (good compression with reasonable speed)
78+
extern int zstd_compression_level;

include/trace_writer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class TraceWriter {
159159
// ========== Mode 1 (Zstd compression) support ==========
160160
ZSTD_CCtx* zstd_ctx_; // Zstd compression context
161161
std::vector<char> compressed_buffer_; // Pre-allocated compression output buffer
162-
int compression_level_; // Zstd compression level (1-22, default 9)
162+
int compression_level_; // Zstd compression level (1-22, default 22)
163163

164164
public:
165165
/**

pr.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## Summary
2+
3+
Add `CUTRACER_ZSTD_LEVEL` environment variable to configure zstd compression level (1-22). This allows users to trade off compression speed vs compression ratio based on their use case.
4+
5+
## Changes
6+
7+
- `include/env_config.h`: Add extern declaration for `zstd_compression_level`
8+
- `src/env_config.cu`: Add environment variable reading logic with validation (range 1-22)
9+
- `src/trace_writer.cpp`: Use configurable compression level instead of hardcoded value 22
10+
- `readme.md`: Document new `CUTRACER_ZSTD_LEVEL` environment variable
11+
12+
## Configuration
13+
14+
`CUTRACER_ZSTD_LEVEL`: Zstd compression level (1-22, default 22)
15+
- Lower values (1-3): Faster compression, slightly larger output
16+
- Higher values (19-22): Maximum compression, slower but smallest output
17+
- Default of 22 provides maximum compression for smallest output
18+
19+
## Motivation
20+
21+
The default compression level of 22 (maximum) prioritizes compression ratio over speed. For use cases where compression speed is more important, users can set a lower level (e.g., 3) to get nearly the same compression ratio with significantly faster compression. This change allows users to choose the trade-off that best suits their workflow.
22+
23+
## Example Usage
24+
25+
```bash
26+
# Fast compression (level 1)
27+
CUTRACER_ZSTD_LEVEL=1 CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app
28+
29+
# Maximum compression (level 22, default)
30+
CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app
31+
32+
# Balanced compression (level 9)
33+
CUTRACER_ZSTD_LEVEL=9 CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so ./app
34+
```
35+
36+
## Test Plan
37+
38+
1. Build CUTracer: `make -j$(nproc)`
39+
2. Verify default level works: Run with `TRACE_FORMAT_NDJSON=1` and check output
40+
3. Verify custom level: Set `CUTRACER_ZSTD_LEVEL=1` and verify faster compression
41+
4. Verify validation: Set invalid value (e.g., 25) and verify warning + fallback to default

readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ CUDA_INJECTION64_PATH=~/CUTracer/lib/cutracer.so \
8383
- **1** (default): NDJSON+Zstd compressed (`.ndjson.zst`, ~12x compression, 92% space savings)
8484
- 0: Plain text (`.log`, legacy format, verbose)
8585
- 2: NDJSON uncompressed (`.ndjson`, for debugging)
86+
- `CUTRACER_ZSTD_LEVEL`: Zstd compression level (1-22, default 22)
87+
- Lower values (1-3): Faster compression, slightly larger output
88+
- Higher values (19-22): Maximum compression, slower but smallest output
89+
- Default of 22 provides maximum compression for smallest output
8690

8791
Note: The tool sets `CUDA_MANAGED_FORCE_DEVICE_ALLOC=1` to simplify channel memory handling.
8892

src/env_config.cu

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ std::unordered_set<AnalysisType> enabled_analysis_types;
2828
// Trace format configuration variable
2929
int trace_format_ndjson;
3030

31+
// Zstd compression level
32+
int zstd_compression_level;
33+
3134
/**
3235
* @brief Parses a comma-separated string of kernel name filters for substring matching.
3336
*
@@ -226,6 +229,15 @@ void init_config_from_env() {
226229
trace_format_ndjson = 0;
227230
}
228231

232+
// Zstd compression level (only used when trace_format_ndjson == 1)
233+
get_var_int(zstd_compression_level, "CUTRACER_ZSTD_LEVEL", 22, "Zstd compression level (1-22, default 22)");
234+
235+
// Validate compression level range
236+
if (zstd_compression_level < 1 || zstd_compression_level > 22) {
237+
printf("WARNING: Invalid CUTRACER_ZSTD_LEVEL=%d. Using default=22.\n", zstd_compression_level);
238+
zstd_compression_level = 22;
239+
}
240+
229241
std::string pad(100, '-');
230242
loprintf("%s\n", pad.c_str());
231243
}

src/trace_writer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include <sstream>
1717
#include <stdexcept>
1818

19+
#include "env_config.h"
20+
1921
// ============================================================================
2022
// Constructor & Destructor
2123
// ============================================================================
@@ -28,7 +30,7 @@ TraceWriter::TraceWriter(const std::string& filename, int trace_mode, size_t buf
2830
trace_mode_(trace_mode),
2931
enabled_(true),
3032
zstd_ctx_(nullptr),
31-
compression_level_(22) { // Maximum compression level for best compression ratio
33+
compression_level_(zstd_compression_level) { // Use configurable compression level from env_config
3234

3335
// Validate trace mode
3436
if (trace_mode < 0 || trace_mode > 2) {

0 commit comments

Comments
 (0)