Skip to content

Implement P2300 bulk adapter for HPX executors#7240

Merged
hkaiser merged 2 commits into
TheHPXProject:masterfrom
shivansh023023:feat/p2300-bulk-integration
May 29, 2026
Merged

Implement P2300 bulk adapter for HPX executors#7240
hkaiser merged 2 commits into
TheHPXProject:masterfrom
shivansh023023:feat/p2300-bulk-integration

Conversation

@shivansh023023
Copy link
Copy Markdown
Contributor

P2300 bulk Integration for HPX Executors

Description

This PR implements the P2300 bulk sender adapter specifically for HPX's legacy executors, including the parallel_executor and sequenced_executor. By bridging the hpx::execution::experimental::bulk algorithm with HPX's internal bulk_sync_execute mechanism, this change ensures that data-parallel workloads are properly load-balanced and optimized using HPX's high-performance partitioners.

Key Technical Improvements:

  • Algorithmic Bridging: Successfully mapped the C++23 bulk sender to the underlying HPX execution engine for native parallel performance.
  • Robust tag_invoke Overloads: Implemented a full suite of connect_t overloads (supporting &&, &, and const&) to ensure compatibility with consumer algorithms like sync_wait.
  • Reference Stability: Utilized std::decay_t within the bulk_receiver to prevent reference collapsing and ensure the safety of deferred functional object execution.
  • Architectural Integrity: Resolved a potential circular dependency by situating the implementation within the executors module rather than the core execution module.

Proposed Changes

  • [New] libs/core/executors/include/hpx/executors/executor_scheduler_bulk.hpp: Implements executor_bulk_sender and executor_bulk_receiver.
  • [Modified] libs/core/executors/include/hpx/executors/executor_scheduler.hpp: Exposes get_completion_scheduler_t for ADL discovery.
  • [Modified] libs/core/executors/include/hpx/executors/parallel_executor.hpp & sequenced_executor.hpp: Integrated the new bulk headers.
  • [New Test] libs/core/executors/tests/unit/executor_algorithm_bulk.cpp: Comprehensive validation for sequential and parallel policies.

Background context

This work is part of the ongoing effort to modernize HPX's execution model to align with the C++23 Sender/Receiver (P2300) standard. Implementing bulk is a "Big Impact" milestone because it allows modern asynchronous pipelines to tap into the mature, multi-threaded performance of the HPX runtime.

Checklist

  • I have added a new feature and have added tests to go along with it.
  • I have verified the implementation with a local build of the executor_algorithm_bulk_test target.
  • I have ensured all includes are strictly alphabetically sorted to comply with the HPX inspect tool.

@shivansh023023 shivansh023023 requested a review from hkaiser as a code owner May 2, 2026 17:39
@StellarBot
Copy link
Copy Markdown
Collaborator

Can one of the admins verify this patch?

@codacy-production
Copy link
Copy Markdown

codacy-production Bot commented May 2, 2026

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from 5cdcfbd to 7b3fc5f Compare May 2, 2026 17:50
@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 3, 2026

@shivansh023023 Just FYI, before you invest more time into our old sender/receiver implementation: #7123 will soon remove almost all of our code related to this. Please focus your efforts on whatever stays after this has been merged.

@hkaiser hkaiser added category: senders/receivers Implementations of the p0443r14 / p2300 + p1897 proposals type: enhancement type: compatibility issue labels May 3, 2026
@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser

Thank you for the heads-up regarding #7123. I appreciate the guidance to avoid spending effort on code that will soon be deprecated.

I will pause my work on the current P2300 bulk adapter and follow the progress of #7123 closely. Once that is merged, I’ll re-evaluate how to implement the bulk functionality within the new framework.

In the meantime, I’ll focus on finishing the review items for PR #7070 (local convenience header) and cleaning up any remaining issues on my other active PRs that are unaffected by the sender/receiver removal.

Comment thread libs/core/executors/include/hpx/executors/executor_scheduler_bulk.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/sequenced_executor.hpp Outdated
@shivansh023023
Copy link
Copy Markdown
Contributor Author

Hi @hkaiser

Thank you for the feedback. I have refactored the PR to align with the latest stdexec changes:

Purged Legacy Code: Removed all !defined(HPX_HAVE_STDEXEC) blocks from executor_scheduler_bulk.hpp.

Header Optimization: Removed the inclusions of executor_scheduler.hpp and executor_scheduler_bulk.hpp from the parallel_executor and sequenced_executor headers.

Forward Declarations: Implemented forward declarations for the returned scheduler types in the executor headers to prevent bloat.

Fixed Includes: Removed the reference to the deprecated get_scheduler.hpp header.

The headers are now much cleaner. Let me know if there are any other areas you'd like me to slim down!

Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/sequenced_executor.hpp Outdated
Comment thread libs/core/executors/tests/unit/executor_algorithm_bulk.cpp Outdated
Comment thread libs/core/executors/tests/unit/executor_algorithm_bulk.cpp Outdated
Copy link
Copy Markdown
Contributor

@charan-003 charan-003 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice work!!!

Copy link
Copy Markdown
Contributor

@charan-003 charan-003 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice work!!!

Comment thread libs/core/executors/include/hpx/executors/executor_scheduler.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/executor_scheduler.hpp Outdated
shivansh023023 pushed a commit to shivansh023023/hpx that referenced this pull request May 7, 2026
…nder/receiver concepts, NVCC guard, dedup get_scheduler, fix post() UB, use get_scheduler in tests
@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from bbfc7db to 1f4aeee Compare May 7, 2026 06:35
@shivansh023023
Copy link
Copy Markdown
Contributor Author

Hi @hkaiser

Thank you for the architectural guidance! I have implemented your suggestions to clean up the header dependencies and tag_invoke logic:

Forwarding Header: I created executor_scheduler_fwd.hpp and moved the declarations there, which allowed me to strip the redundant forward declarations from the individual executor headers.

Tag-Invoke Overloads: I removed the default template arguments and duplicate overloads in parallel_executor and sequenced_executor, replacing them with the concrete friend functions you suggested.

NVCC Fix: I ensured the NVCC/CUDACC guards for the destructors were correctly restored.

Standard Test Patterns: I updated the unit tests to use the standard ex::get_scheduler(exec) call instead of manual constructor calls.

The structure feels much more consistent with the rest of the HPX core modules now. Thanks!

@shivansh023023
Copy link
Copy Markdown
Contributor Author

Hi @charan-003

Thanks for the catch on the stdexec compliance and the safety issues! I’ve updated the implementation as follows:

Sender/Receiver Concepts: I added sender_concept to executor_sender and receiver_concept to executor_bulk_receiver. These are now correctly picked up by the stdexec concept checks.

UB Fix in post: I refactored the lambda capture in executor_operation_state::start(). It now captures the state by reference and only moves the receiver inside the task body. This ensures that if hpx::parallel::execution::post throws, the receiver is still valid for the set_error call in the catch block.

I really appreciate the eye for detail on that potential move-before-post UB,definitely a safer implementation now!

Comment thread libs/core/executors/include/hpx/executors/executor_scheduler.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/executor_scheduler_bulk.hpp Outdated
Comment thread libs/core/executors/include/hpx/executors/parallel_executor.hpp Outdated
@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from d0b7f07 to 7ab5571 Compare May 8, 2026 07:39
@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser
I have just pushed the latest updates for PR #7240, and I’m happy to report that all CI checks are passing! I’ve implemented your latest suggestions to fully modernize the implementation:

C++20 Concepts: I’ve replaced the legacy std::enable_if_t in the executor_scheduler constructor with a clean C++20 requires clause and included the header.

Purged Redundant Guards: Removed the #if defined(HPX_HAVE_STDEXEC) guards in executor_scheduler_bulk.hpp, as we now rely strictly on the modern Sender/Receiver path.

Header Optimization: I have completely removed the implementation headers (executor_scheduler.hpp and executor_scheduler_bulk.hpp) from parallel_executor.hpp and sequenced_executor.hpp. These files now rely solely on the lightweight executor_scheduler_fwd.hpp header, significantly reducing the include bloat for the core executors.

The code is now much cleaner and follows the forwarding pattern we discussed. It should be ready for a final review!

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 8, 2026

@shivansh023023 Thanks for the updates. I'd like to wait for #7257 to be finalized before merging anything else related to s&r. Please be patient as this may take a moment.

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@shivansh023023 Thanks for the updates. I'd like to wait for #7257 to be finalized before merging anything else related to s&r. Please be patient as this may take a moment.

Sure sir

@shivansh023023
Copy link
Copy Markdown
Contributor Author

Hey @hkaiser , all the CI checks are passing and I've implemented all your feedback
from the last review. Can you review it again and tell me if it needs any improvements or can it be merged

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@charan-003
Hey Charan are you on discord by any chance? I'd love to connect there and get a lil guidance from you on a few things, if you're open to it!

@charan-003
Copy link
Copy Markdown
Contributor

charan-003 commented May 22, 2026

@charan-003 Hey Charan are you on discord by any chance? I'd love to connect there and get a lil guidance from you on a few things, if you're open to it!

My Discord ID: charan_003

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@charan-003 Hey Charan are you on discord by any chance? I'd love to connect there and get a lil guidance from you on a few things, if you're open to it!

My Discord ID: charan_003

i've sent you a request
my discord id : acelegend7657

@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from d357952 to 8547843 Compare May 22, 2026 04:36
@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser I gutted the old tag_invoke logic and migrated everything to member functions per the latest P2300 spec. I also cleaned up the concept constraints and made sure the lambda captures are safe.

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 22, 2026

@hkaiser I gutted the old tag_invoke logic and migrated everything to member functions per the latest P2300 spec. I also cleaned up the concept constraints and made sure the lambda captures are safe.

There are still a couple of completely unrelated changes that should be removed.

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser I gutted the old tag_invoke logic and migrated everything to member functions per the latest P2300 spec. I also cleaned up the concept constraints and made sure the lambda captures are safe.

There are still a couple of completely unrelated changes that should be removed.

can you tell me what are those changes , so that i can remove them

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 22, 2026

@hkaiser I gutted the old tag_invoke logic and migrated everything to member functions per the latest P2300 spec. I also cleaned up the concept constraints and made sure the lambda captures are safe.

There are still a couple of completely unrelated changes that should be removed.

can you tell me what are those changes , so that i can remove them

Please see my comments above (e.g., #7240 (comment) and others)

@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from 8547843 to 645ef48 Compare May 22, 2026 22:24
@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser can you review it sir ?

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 23, 2026

All the unrelated changes that I mentioned are still part of this PR (related to the unique algorithm). Please look here https://github.com/TheHPXProject/hpx/pull/7240/changes to see the full diff.

@codacy-production
Copy link
Copy Markdown

codacy-production Bot commented May 23, 2026

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 23, 2026

Now you have suddenly touched on over 380 files! I'd suggest reverting the most recent commit and remove the unrelated changes manually (i.e., not involving the help of any LLM).

@shivansh023023 shivansh023023 force-pushed the feat/p2300-bulk-integration branch from 2fa00bc to 22a10f4 Compare May 23, 2026 18:42
hkaiser
hkaiser previously approved these changes May 23, 2026
Copy link
Copy Markdown
Contributor

@hkaiser hkaiser left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@hkaiser hkaiser added this to the 2.0.0 milestone May 23, 2026
@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 24, 2026

@shivansh023023 Could you please rebase this onto master to resolve the conflicts?

- Add executor_scheduler_bulk.hpp with bulk sender/receiver for executor-based schedulers
- Add executor_algorithm_bulk.cpp unit test covering sequenced and parallel bulk execution
- Register new header and test in CMakeLists

Signed-off-by: Shivansh Singh <your_github_email@example.com>
@shivansh023023
Copy link
Copy Markdown
Contributor Author

@shivansh023023 Could you please rebase this onto master to resolve the conflicts?

done

hkaiser
hkaiser previously approved these changes May 25, 2026
Copy link
Copy Markdown
Contributor

@hkaiser hkaiser left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks! Do you plan to support bulk_chunked and bulk_unchunked as well?

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@hkaiser Yes, I plan to support bulk_chunked and bulk_unchunked as well. this PR establishes the core P2300 bulk adapter infrastructure, I thought it was best to keep this diff focused and manageable. will open a separate follow-up PR shortly to implement the chunked and unchunked variations, building directly on top of this foundation.

Comment on lines +166 to +172
auto tag_invoke(bulk_t, executor_scheduler<Executor> const& sched,
Sender&& sender, Shape const& shape, F&& f)
{
return detail::executor_bulk_sender<Executor, std::decay_t<Sender>,
Shape, std::decay_t<F>>{
sched.exec_, HPX_FORWARD(Sender, sender), shape, HPX_FORWARD(F, f)};
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Replace tag_invoke with a member function. tag_invoke is deprecated.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shivansh023023 Could you please fix this?

@hkaiser
Copy link
Copy Markdown
Contributor

hkaiser commented May 28, 2026

@shivansh023023 I think that this PR should be the next one to be worked on and finalized. Could you please have a look at @charan-003's comment (#7240 (comment))?

…r_scheduler

Refactor the P2300 bulk customization point from a deprecated tag_invoke
free function to a member function on executor_scheduler, matching the
modern P2300 sender/receiver specification.

- Add bulk() member declaration in executor_scheduler (executor_scheduler.hpp)
- Define bulk() out-of-line in executor_scheduler_bulk.hpp after
  executor_bulk_sender is fully defined
- Remove the tag_invoke(bulk_t, executor_scheduler, ...) free function

Signed-off-by: Shivansh Singh <your_github_email@example.com>
@charan-003
Copy link
Copy Markdown
Contributor

LGTM

@shivansh023023
Copy link
Copy Markdown
Contributor Author

@shivansh023023 I think that this PR should be the next one to be worked on and finalized. Could you please have a look at @charan-003's comment (#7240 (comment))?

Done

@hkaiser hkaiser merged commit d2b0011 into TheHPXProject:master May 29, 2026
89 of 100 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

category: senders/receivers Implementations of the p0443r14 / p2300 + p1897 proposals type: compatibility issue type: enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants