/* * Copyright 2008-2013 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC) # pragma GCC system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG) # pragma clang system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC) # pragma system_header #endif // no system header #if THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_NVCC # include # include # include # include # include THRUST_NAMESPACE_BEGIN namespace cuda_cub { template inline _CCCL_HOST_DEVICE void assign_value(thrust::cuda::execution_policy& exec, Pointer1 dst, Pointer2 src) { // XXX war nvbugs/881631 struct war_nvbugs_881631 { _CCCL_HOST inline static void host_path(thrust::cuda::execution_policy& exec, Pointer1 dst, Pointer2 src) { cuda_cub::copy(exec, src, src + 1, dst); } _CCCL_DEVICE inline static void device_path(thrust::cuda::execution_policy&, Pointer1 dst, Pointer2 src) { *thrust::raw_pointer_cast(dst) = *thrust::raw_pointer_cast(src); } }; NV_IF_TARGET( NV_IS_HOST, (war_nvbugs_881631::host_path(exec, dst, src);), (war_nvbugs_881631::device_path(exec, dst, src);)); } // end assign_value() template inline _CCCL_HOST_DEVICE void assign_value(cross_system& systems, Pointer1 dst, Pointer2 src) { // XXX war nvbugs/881631 struct war_nvbugs_881631 { _CCCL_HOST inline static void host_path(cross_system& systems, Pointer1 dst, Pointer2 src) { // rotate the systems so that they are ordered the same as (src, dst) // for the call to thrust::copy cross_system rotated_systems = systems.rotate(); cuda_cub::copy(rotated_systems, src, src + 1, dst); } _CCCL_DEVICE inline static void device_path(cross_system&, Pointer1 dst, Pointer2 src) { // XXX forward the true cuda::execution_policy inside systems here // instead of materializing a tag thrust::cuda::tag cuda_tag; thrust::cuda_cub::assign_value(cuda_tag, dst, src); } }; NV_IF_TARGET(NV_IS_HOST, (war_nvbugs_881631::host_path(systems, dst, src);), (war_nvbugs_881631::device_path(systems, dst, src);)); } // end assign_value() } // namespace cuda_cub THRUST_NAMESPACE_END #endif