Skip to content
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

[oneDPL] Create a subsection for is_execution_policy type trait #567

Merged
merged 12 commits into from
Oct 10, 2024
61 changes: 54 additions & 7 deletions source/elements/oneDPL/source/parallel_api/execution_policies.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ Execution Policies
C++ Standard Aligned Execution Policies
+++++++++++++++++++++++++++++++++++++++

oneDPL has the set of execution policies and related utilities that are semantically aligned
with the `C++ Standard`_, 6th edition (C++20):
oneDPL has the set of execution policies semantically aligned with the `C++ Standard`_, 6th edition (C++20):

.. code:: cpp

Expand All @@ -30,17 +29,16 @@ with the `C++ Standard`_, 6th edition (C++20):
inline constexpr parallel_unsequenced_policy par_unseq { /*unspecified*/ };
inline constexpr unsequenced_policy unseq { /*unspecified*/ };

template <class T>
struct is_execution_policy;

template <class T>
inline constexpr bool is_execution_policy_v = oneapi::dpl::execution::is_execution_policy<T>::value;
}
}
}

See "Execution policies" in the `C++ Standard`_ for more information.

.. note::
The ``std::is_execution_policy`` type trait resolves to ``std::false_type`` for oneDPL execution policies.
Implementations and programs should instead use the :ref:`oneDPL type trait <exec-policy-type-trait>`.

Device Execution Policy
+++++++++++++++++++++++

Expand Down Expand Up @@ -180,5 +178,54 @@ as the template argument, otherwise unspecified.
Return a policy object constructed from ``policy``, with a new kernel name provided as the template
argument. If no policy object is provided, the new policy is constructed from ``dpcpp_default``.

.. _exec-policy-type-trait:

Execution Policy Type Trait
+++++++++++++++++++++++++++

oneDPL provides type trait utilities to detect its execution policy types at compile time for the purpose of
function overload resolution:

.. code:: cpp

// Defined in <oneapi/dpl/execution>

namespace oneapi {
namespace dpl {
danhoeflinger marked this conversation as resolved.
Show resolved Hide resolved

template <class T>
struct is_execution_policy { /*see below*/ };

template <class T>
constexpr inline bool is_execution_policy_v = oneapi::dpl::is_execution_policy<T>::value;
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
constexpr inline bool is_execution_policy_v = oneapi::dpl::is_execution_policy<T>::value;
inline constexpr bool is_execution_policy_v = oneapi::dpl::is_execution_policy<T>::value;

I prefer that order because this is the way it's defined in C++ standard. I don't want to hold this PR because of that issue but if you decide to change it the way I am suggesting, please ping me and I approve this patch once again.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No problem, I will do it. No re-approval is needed, thanks.


namespace execution {

template <class T>
struct is_execution_policy { /*see below*/ };

template <class T>
constexpr inline bool is_execution_policy_v = oneapi::dpl::execution::is_execution_policy<T>::value;

}
}
}

``oneapi::dpl::is_execution_policy`` and ``oneapi::dpl::execution::is_execution_policy`` must be treated as name aliases
to the same class template. It is unspecified in which namespace the underlying class template and its specializations
are defined.
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
to the same class template. It is unspecified in which namespace the underlying class template and its specializations
are defined.
to the same class template. It is unspecified, which namespace the underlying class template and its specializations
are defined in.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Spellcheckers do not complain :), so I will keep this intact.

Copy link
Contributor

Choose a reason for hiding this comment

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

Sure, this is small suggestion. As far as I understand "preposition + which" is consider to be poorer English. More common use is "bla-bla, which + <proposition at the end>. Again, not proposing to change that but for my curiosity we could summon a native speaker. @danhoeflinger, could you please share your opinion?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I searched for clarification on this, and I have found that "preposition + which" is considered not poorer but more formal English.

Copy link
Contributor

Choose a reason for hiding this comment

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

I agree that "in which" is more formal (but a bit awkward), and "which ... in" is less formal, and a "dangling preposition" https://www.thefreedictionary.com/Dangling-Prepositions.htm which is a classic English grammar issue.

I was trying to rephrase to avoid the problem, but I think it may make it less clear.

"The location of the underlying class template definition and its specializations is left unspecified."

Copy link
Contributor

Choose a reason for hiding this comment

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

Another option, avoiding the preposition:
"It is unspecified, which namespace contains the underlying class template definition and its specializations."

Copy link
Contributor Author

@akukanov akukanov Oct 10, 2024

Choose a reason for hiding this comment

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

Thanks Dan, I like the last suggestion, will apply it.

Copy link
Contributor

Choose a reason for hiding this comment

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

"It is unspecified, which namespace contains the underlying class template definition and its specializations."

I also like that.

... not poorer but more formal English.

Thanks for clarification


.. note::
The ``oneapi::dpl::execution::is_execution_policy`` class originated in the oneDPL specification version 1.0,
while ``oneapi::dpl::is_execution_policy`` has been added later to better align with the C++ standard.

For new code, use of the type trait utilities in ``namespace oneapi::dpl`` is highly recommended. Those
in ``namespace oneapi::dpl::execution`` are provided for backward compatibility and may be deprecated in the future.

``is_execution_policy<T>`` must have the characteristics of ``std::true_type`` if ``T`` is one of the above specified or
implementation-defined oneDPL execution policy types, otherwise it must have the characteristics of ``std::false_type``.
akukanov marked this conversation as resolved.
Show resolved Hide resolved
Following the C++ Standard, ``is_execution_policy<T>`` does not automatically strip references and cv-qualifiers from
its template argument. [*Note*: Use it with ``std::decay_t<T>`` or similar type transformation utilities. -- *end note*]

.. _`C++ Standard`: https://isocpp.org/std/the-standard
.. _`SYCL`: https://registry.khronos.org/SYCL/specs/sycl-2020/html/sycl-2020.html