VTK-m does not build with CUDA compute capability < 9.0
Hello,
The line Atomic.h#L171 is
auto result = atomicAdd(addr, arg);
where addr
and arg
can be float.
But reading the CUDA documentation, ...
The float2 and float4 floating-point vector versions of atomicAdd() are only supported by devices of compute capability 9.x and higher.
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
Perhaps, VTK-m could check CUDA compute capability >= 9.0 in its CMake file compared to VTKm_CUDA_Architecture
.
As if one is using < 9.0 one gets the error message if this is not checked:
/vtk-m-v2.0.0/vtkm/Atomic.h(171): error: no instance of overloaded function "atomicAdd" matches the argument list
argument types are: (vtkm::Float64 *, vtkm::Float64)
detected during:
instantiation of "T vtkm::detail::AtomicAddImpl(T *, T, vtkm::MemoryOrder) [with T=vtkm::Float64]"
(829): here
instantiation of "T vtkm::AtomicAdd(T *, T, vtkm::MemoryOrder) [with T=vtkm::Float64]"
/vtk-m-v2.0.0/vtkm/exec/AtomicArrayExecutionObject.h(149): here
instantiation of "vtkm::exec::AtomicArrayExecutionObject<T>::ValueType vtkm::exec::AtomicArrayExecutionObject<T>::Add(vtkm::Id, const vtkm::exec::AtomicArrayExecutionObject<T>::ValueType &) const [with T=vtkm::Float64]"
/vtk-m-v2.0.0/vtkm/filter/density_estimate/ParticleDensityNearestGridPoint.cxx(42): here
instantiation of "void vtkm::worklet::NGPWorklet::operator()(const Point &, T, const CellLocatorExecObj &, AtomicArray &) const [with Point=vtkm::Vec<vtkm::FloatDefault, 3>, T=vtkm::Float64, CellLocatorExecObj=vtkm::exec::CellLocatorUniformGrid, AtomicArray=vtkm::exec::AtomicArrayExecutionObject<vtkm::Float64>]"
/vtk-m-v2.0.0/vtkm/exec/internal/WorkletInvokeFunctorDetail.h(631): here
instantiation of "void vtkm::exec::internal::detail::DoWorkletInvokeFunctor(const WorkletType &, const vtkm::internal::Invocation<ParameterInterface, ControlInterface, vtkm::internal::FunctionInterface<void (P1, P2, P3, P4)>, InputDomainIndex, OutputToInputMapType, VisitArrayType, ThreadToOutputMapType, DeviceAdapterTag> &, const ThreadIndicesType &) [with WorkletType=vtkm::worklet::NGPWorklet, ParameterInterface=vtkm::internal::FunctionInterface<void (vtkm::internal::ArrayPortalMultiplexer<vtkm::internal::ArrayPortalBasicRead<vtkm::Vec<vtkm::FloatDefault, 3>>, vtkm::internal::ArrayPortalSOA<vtkm::Vec<vtkm::FloatDefault, 3>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float64>>, vtkm::internal::ArrayPortalUniformPointCoordinates, vtkm::internal::ArrayPortalCartesianProduct<vtkm::Vec<vtkm::FloatDefault, 3>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float64>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float64>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float64>>, vtkm::internal::ArrayPortalTransform<vtkm::Vec3f, vtkm::internal::ArrayPortalBasicRead<vtkm::Vec<vtkm::Float32, 3>>, vtkm::cont::internal::Cast<vtkm::Vec<vtkm::Float32, 3>, vtkm::Vec3f>, vtkm::cont::internal::Cast<vtkm::Vec3f, vtkm::Vec<vtkm::Float32, 3>>>, vtkm::internal::ArrayPortalTransform<vtkm::Vec3f, vtkm::internal::ArrayPortalSOA<vtkm::Vec<vtkm::Float32, 3>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float32>>, vtkm::cont::internal::Cast<vtkm::Vec<vtkm::Float32, 3>, vtkm::Vec3f>, vtkm::cont::internal::Cast<vtkm::Vec3f, vtkm::Vec<vtkm::Float32, 3>>>, vtkm::internal::ArrayPortalTransform<vtkm::Vec3f, vtkm::internal::ArrayPortalCartesianProduct<vtkm::Vec<vtkm::Float32, 3>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float32>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float32>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float32>>, vtkm::cont::internal::Cast<vtkm::Vec<vtkm::Float32, 3>, vtkm::Vec3f>, vtkm::cont::internal::Cast<vtkm::Vec3f, vtkm::Vec<vtkm::Float32, 3>>>>, vtkm::internal::ArrayPortalBasicRead<vtkm::Float64>, vtkm::exec::CellLocatorUniformGrid, vtkm::exec::AtomicArrayExecutionObject<vtkm::Float64>)>, ControlInterface=vtkm::internal::FunctionInterface<vtkm::worklet::NGPWorklet::ControlSignature>, InputDomainIndex=1, OutputToInputMapType=vtkm::internal::ArrayPortalImplicit<vtkm::internal::IndexFunctor>, VisitArrayType=vtkm::internal::ArrayPortalImplicit<vtkm::cont::internal::ConstantFunctor<vtkm::IdComponent>>, ThreadToOutputMapType=vtkm::internal::ArrayPortalImplicit<vtkm::internal::IndexFunctor>, DeviceAdapterTag=vtkm::cont::DeviceAdapterTagCuda, ThreadIndicesType=vtkm::exec::arg::ThreadIndicesBasic, P1=vtkm::worklet::internal::WorkletBase::_1, P2=vtkm::worklet::internal::WorkletBase::_2, P3=vtkm::worklet::internal::WorkletBase::_3, P4=vtkm::worklet::internal::WorkletBase::_4]"
/vtk-m-v2.0.0/vtkm/exec/cuda/internal/TaskStrided.h(80): here
[ 15 instantiation contexts not shown ]
instantiation of "void vtkm::worklet::internal::DispatcherBase<DerivedClass, WorkletType, BaseWorkletType>::Invoke(Args &&...) const [with DerivedClass=vtkm::worklet::DispatcherMapField<vtkm::worklet::NGPWorklet>, WorkletType=vtkm::worklet::NGPWorklet, BaseWorkletType=vtkm::worklet::WorkletMapField, Args=<vtkm::cont::CoordinateSystem::MultiplexerArrayType &, const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic> &, vtkm::cont::CellLocatorUniformGrid &, vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic> &>]"
/vtk-m-v2.0.0/vtkm/cont/Invoker.h(118): here
instantiation of "void vtkm::cont::Invoker::operator()(Worklet &&, T &&, Args &&...) const [with Worklet=vtkm::worklet::NGPWorklet, T=vtkm::cont::CoordinateSystem::MultiplexerArrayType &, Args=<const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic> &, vtkm::cont::CellLocatorUniformGrid &, vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic> &>, <unnamed>=(int *)nullptr]"
/vtk-m-v2.0.0/vtkm/cont/UnknownArrayHandle.h(997): here
instantiation of "void vtkm::cont::detail::UnknownArrayHandleTry::operator()(vtkm::List<T, S>, Functor &&, __nv_bool &, const vtkm::cont::UnknownArrayHandle &, Args &&...) const [with T=vtkm::Float64, S=vtkm::cont::StorageTagBasic, Functor=lambda [](const auto &)->auto &, Args=<>]"
/vtk-m-v2.0.0/vtkm/List.h(724): here
instantiation of "void vtkm::ListForEach(Functor &&, vtkm::List<Ts...>, Args &&...) [with Functor=vtkm::cont::detail::UnknownArrayHandleTry, Ts=<vtkm::List<vtkm::Float32, vtkm::cont::StorageTagBasic>, vtkm::List<vtkm::Float32, vtkm::cont::StorageTagConstant>, vtkm::List<vtkm::Float64, vtkm::cont::StorageTagBasic>, vtkm::List<vtkm::Float64, vtkm::cont::StorageTagConstant>>, Args=<lambda [](const auto &)->auto &, __nv_bool &, const vtkm::cont::UnknownArrayHandle &>]"
/vtk-m-v2.0.0/vtkm/cont/UnknownArrayHandle.h(1041): here
instantiation of "void vtkm::cont::UnknownArrayHandle::CastAndCallForTypes<TypeList,StorageList,Functor,Args...>(Functor &&, Args &&...) const [with TypeList=vtkm::TypeListFieldScalar, StorageList=vtkm::List<vtkm::cont::StorageTagBasic, vtkm::cont::StorageTagSOA, vtkm::cont::StorageTagUniformPoints, vtkm::cont::StorageTagCartesianProduct<vtkm::cont::StorageTagBasic, vtkm::cont::StorageTagBasic, vtkm::cont::StorageTagBasic>, vtkm::cont::StorageTagConstant>, Functor=lambda [](const auto &)->auto &, Args=<>]"
/vtk-m-v2.0.0/vtkm/filter/density_estimate/ParticleDensityNearestGridPoint.cxx(113): here
1 error detected in the compilation of "/vtk-m-v2.0.0/vtkm/filter/density_estimate/ParticleDensityNearestGridPoint.cxx".