-
Notifications
You must be signed in to change notification settings - Fork 737
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[SYCL][Clang] Add support for device image compression #15124
Conversation
Some initial performance stats: Dataset: https://github.com/aras-p/smol-v/tree/master/tests/spirv-dumps Conclusion: Note:- Most of the SPIR-V files I have in the dataset are <50KB. I'm working on extending the performance evaluation to larger workloads. Also, the (de)compression performance will vary with the format of the file being compressed, so for AOT, where device images consists of target assembly, the performance stats might differ. |
What happens with the PTX and AMDGPU targets? Are they covered by the "native" binary image format? Do we need additional formats? |
Also guessing this feature may not make sense when combined with the native cpu device, but need to think more about that. |
I think they are covered by the "none" binary image format. This is because clang driver (in SYCL offload mode) never specifies the image format in call to I tested my changes with PTX, and they seem to work fine, so, we'd likely not require additional formats. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK for driver
@bso-intel @intel/llvm-reviewers-runtime ping! |
llvm::compression::zstd::compress( | ||
ArrayRef<unsigned char>( | ||
(const unsigned char *)(Bin->getBufferStart()), | ||
Bin->getBufferSize()), | ||
CompressedBuffer, OffloadCompressLevel); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When the crash occurs when compression failed, the error message that the SYCL end-user will receive may not be useful.
For example, "Failed to create ZSTD_CCtx", ""Failed to set ZSTD_c_compressionLevel", etc.
It would be much better user experience if they get a message like "Device image compression failed." + e.what().
"'--offload-compress' option is specified but zstd " | ||
"is not available. The device image will not be " | ||
"compressed."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This kind of error message is good since the SYCL end-user can understand what went wrong.
In 946a738, I've wrapped zstd::compress in try/catch to throw a more meaningful error message. Note that this will only work if DPC++ is built with |
@intel/llvm-gatekeepers The PR is ready to be merged. All the downstream infrastructure, along with intel/llvm CI machines, is ready with zstd installed. |
@uditagarwal97 Could you please take a look at post-commit failures: https://github.com/intel/llvm/actions/runs/11468699849/job/31915329901 Failed Tests (2): On AMD/HIP |
@@ -178,6 +178,8 @@ def do_configure(args): | |||
"-DLLVM_ENABLE_PROJECTS={}".format(llvm_enable_projects), | |||
"-DSYCL_BUILD_PI_HIP_PLATFORM={}".format(sycl_build_pi_hip_platform), | |||
"-DLLVM_BUILD_TOOLS=ON", | |||
"-DLLVM_ENABLE_ZSTD=ON", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we shouldn't turn on these by default? We should just turn on them in if args.ci_defaults:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea behind turning them on by default is to build the compiler with device image compression support if the user has zstd-dev package installed. If zstd is not found, there shouldn't be any build error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there are configurate failures.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CMake Error at lib/Support/CMakeLists.txt:327 (get_property):
get_property could not find TARGET zstd::libzstd_static. Perhaps it has
not yet been created.
CMake Error at lib/Support/CMakeLists.txt:330 (get_property):
get_property could not find TARGET zstd::libzstd_static. Perhaps it has
not yet been created.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah local build is cooked for me too, we need to revert the on by zstd default part at least
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR to temporarily turn off zstd by default: #15833
PR to disable the failing tests on HIP: #15830 |
This PR adds support for device image compression for the old offloading model. I'll make another follow-up PR to extend support for the new offload model.
Design summary:
This PR introduces ZSTD (https://github.com/facebook/zstd) as a 3rd party dependency of DPCPP. Similar to upstream LLVM, we expect user to have
zstd-dev
package installed on their machine - we won't be installing zstd from sources.How to use
To compress device images, add
--offload-compress
CLI option to your clang invocation. Note that we compress device images only if the size of device images exceeds a threshold, which is 512 bytes by default. Moreover, by default, we use ZSTD level 10 for compression. ZSTD compression levels provides a tradeoff between (de)compression time and compression ratio, and the compression level can be changed using--offload-compression-level=<int>
CLI option.