diff --git a/docs/cccl_development/macro.rst b/docs/cccl_development/macro.rst index 6bf1b0b67ab..30de6aa8b10 100644 --- a/docs/cccl_development/macro.rst +++ b/docs/cccl_development/macro.rst @@ -264,13 +264,15 @@ Usage example: **Portable Builtin Macros**: -+-----------------------------+--------------------------------------------+ -| ``_CCCL_UNREACHABLE()`` | Portable ``__builtin_unreachable()`` | -+-----------------------------+--------------------------------------------+ -| ``_CCCL_BUILTIN_ASSUME(X)`` | Portable ``__builtin_assume(X)`` | -+-----------------------------+--------------------------------------------+ -| ``_CCCL_BUILTIN_EXPECT(X)`` | Portable ``__builtin_expected(X)`` | -+-----------------------------+--------------------------------------------+ ++---------------------------------------+--------------------------------------------+ +| ``_CCCL_UNREACHABLE()`` | Portable ``__builtin_unreachable()`` | ++---------------------------------------+--------------------------------------------+ +| ``_CCCL_BUILTIN_ASSUME(X)`` | Portable ``__builtin_assume(X)`` | ++---------------------------------------+--------------------------------------------+ +| ``_CCCL_BUILTIN_EXPECT(X)`` | Portable ``__builtin_expected(X)`` | ++---------------------------------------+--------------------------------------------+ +| ``_CCCL_BUILTIN_PREFETCH(X[, Y, Z])`` | Portable ``__builtin_prefetch(X, Y, Z)`` | ++---------------------------------------+--------------------------------------------+ **Portable Keyword Macros** diff --git a/libcudacxx/include/cuda/std/__cccl/builtin.h b/libcudacxx/include/cuda/std/__cccl/builtin.h index f1eed7a0c7b..aee334b5562 100644 --- a/libcudacxx/include/cuda/std/__cccl/builtin.h +++ b/libcudacxx/include/cuda/std/__cccl/builtin.h @@ -111,6 +111,12 @@ NV_IF_ELSE_TARGET(NV_IS_DEVICE, (__builtin_assume(__VA_ARGS__);), (__assume(__VA_ARGS__);)) #endif // _CCCL_CHECK_BUILTIN(builtin_assume) +#if _CCCL_CHECK_BUILTIN(builtin_prefetch) || _CCCL_COMPILER(GCC) +# define _CCCL_BUILTIN_PREFETCH(...) NV_IF_TARGET(NV_IS_HOST, __builtin_prefetch(__VA_ARGS__);) +#else +# define _CCCL_BUILTIN_PREFETCH(...) +#endif // _CCCL_CHECK_BUILTIN(builtin_prefetch) + // NVCC prior to 11.2 cannot handle __builtin_assume #if _CCCL_CUDACC_BELOW(11, 2) # undef _CCCL_BUILTIN_ASSUME diff --git a/libcudacxx/test/libcudacxx/libcxx/macros/prefetch.compile.pass.cpp b/libcudacxx/test/libcudacxx/libcxx/macros/prefetch.compile.pass.cpp new file mode 100644 index 00000000000..3bdb143f8fa --- /dev/null +++ b/libcudacxx/test/libcudacxx/libcxx/macros/prefetch.compile.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +// +//===----------------------------------------------------------------------===// + +#include + +#include + +int main(int, char**) +{ + int memory[8]; + _CCCL_BUILTIN_PREFETCH(memory); + _CCCL_BUILTIN_PREFETCH(memory, /*read-only=*/0); + _CCCL_BUILTIN_PREFETCH(memory, /*read-only=*/0, /*medium cache utilization=*/1); + unused(memory); + return 0; +}