Commit Graph

2974 Commits

Author SHA1 Message Date
Kenneth Moreland
ac889b5004 Implement VecTraits class for all types
The `VecTraits` class allows templated functions, methods, and classes to
treat type arguments uniformly as `Vec` types or to otherwise differentiate
between scalar and vector types. This only works for types that `VecTraits`
is defined for.

The `VecTraits` templated class now has a default implementation that will
be used for any type that does not have a `VecTraits` specialization. This
removes many surprise compiler errors when using a template that, unknown
to you, has `VecTraits` in its implementation.

One potential issue is that if `VecTraits` gets defined for a new type, the
behavior of `VecTraits` could change for that type in backward-incompatible
ways. If `VecTraits` is used in a purely generic way, this should not be an
issue. However, if assumptions were made about the components and length,
this could cause problems.

Fixes #589
2023-03-16 12:59:38 -06:00
Kenneth Moreland
58fc99c2f8 Fix fast paths for ArrayRangeCompute
The precompiled `ArrayRangeCompute` function was not following proper fast
paths for special arrays. For example, when computing the range of an
`ArrayHandleUniformPointCoordinates`, the ranges should be taken from the
origin and spacing of the special array. However, the precompiled version
was calling the generic range computation, which was doing an unnecessary
reduction over the entire array. These fast paths have been fixed.

These mistakes in the code were caused by quirks in how templated method
overloading works. To prevent this mistake from happening again in the
precompiled `ArrayRangeCompute` function and elsewhere, all templated forms
of `ArrayRangeCompute` have been deprecated. Most will call
`ArrayRangeCompute` with no issues. For those that need the templated
version, `ArrayRangeComputeTemplate` replaces the old templated
`ArrayRangeCompute`. There is exactly one templated declaration of
`ArrayRangeComputeTemplate` that uses a class, `ArrayRangeComputeImpl`,
with partial specialization to ensure the correct form is used.
2023-03-08 12:36:53 -07:00
Kenneth Moreland
4b19139f3d Add tests to UnitTestArrayRangeCompute
Make the test a bit more complete by testing more array types.
2023-03-08 12:36:53 -07:00
Kenneth Moreland
69a9d4a87e Merge topic 'convert-runtime-vec-array'
331a277fe Automatically convert between ArrayHandleBasic and ArrayHandleRuntimeVec

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Li-Ta Lo <ollie@lanl.gov>
Merge-request: !2994
2023-03-08 14:35:30 -05:00
Thomas H. Gibson
b1bb050bc8 Merge topic 'thrust-sorting'
267ee49cb docker: update kokkos hip image
67bf9a966 docker: update kokkos hip image
50d4ab5cc CMake: VTKm_ENABLE_KOKKOS_THRUST to depend on Kokkos with CUDA or HIP enabled
0604f314a Fix for building SERIAL unit tests with KOKKOS_HIP/CUDA enabled
802bf80b0 CI: Add rocthrust installation step
fda475d5b Rework Thrust CMake options
e6f63a807 Adding CMake tweaks to turn off thrust algorithms if thrust is not detected.
5a72275ed Rewrite sorting specialization using std::enable_if_t
...

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2926
2023-03-06 09:48:43 -05:00
Kenneth Moreland
2af555f6c9 Simplify serialization of DataSet objects
`vtkm::cont::DataSet` is a dynamic object that can hold cell sets and
fields of many different types, none of which are known until runtime. This
causes a problem with serialization, which has to know what type to compile
the serialization for, particularly when unserializing the type at the
receiving end. The original implementation "solved" the problem by creating
a secondary wrapper object that was templated on types of field arrays and
cell sets that might be serialized. This is not a great solution as it
punts the problem to algorithm developers.

This problem has been completely solved for fields, as it is possible to
serialize most types of arrays without knowing their type now. You still
need to iterate over every possible `CellSet` type, but there are not that
many `CellSet`s that are practically encountered. Thus, there is now a
direct implementation of `Serialization` for `DataSet` that covers all the
data types you are likely to encounter.

The old `SerializableDataSet` has been deprecated. In the unlikely event an
algorithm needs to transfer a non-standard type of `CellSet` (such as a
permuted cell set), it can use the replacement `DataSetWithCellSetTypes`,
which just specifies the cell set types.
2023-03-03 09:17:44 -07:00
Kenneth Moreland
331a277fe3 Automatically convert between ArrayHandleBasic and ArrayHandleRuntimeVec
The `UnknownArrayHandle` has been updated to allow
`ArrayHandleRuntimeVec` to work interchangeably with basic
`ArrayHandle`. If an `ArrayHandleRuntimeVec` is put into an
`UnknownArrayHandle`, it can be later retrieved as an `ArrayHandleBasic`
as long as the base component type matches and it has the correct amount
of components. This means that an array can be created as an
`ArrayHandleRuntimeVec` and be used with any filters or most other
features designed to operate on basic `ArrayHandle`s. Likewise, an array
added as a basic `ArrayHandle` can be retrieved in an
`ArrayHandleRuntimeVec`. This makes it easier to pull arrays from VTK-m
and place them in external structures (such as `vtkDataArray`).
2023-02-20 07:39:49 -07:00
Sean Miller
0604f314aa Fix for building SERIAL unit tests with KOKKOS_HIP/CUDA enabled 2023-02-20 08:28:34 -06:00
Sean Miller
e6f63a807d Adding CMake tweaks to turn off thrust algorithms if thrust is not detected. 2023-02-20 08:26:24 -06:00
Thomas Gibson
5a72275ed8 Rewrite sorting specialization using std::enable_if_t 2023-02-20 08:25:05 -06:00
Sean Miller
04013b9924 Add sorting implementation using thrust
Co-authored-by: Thomas Gibson <thomas.gibson@amd.com>
2023-02-20 08:25:02 -06:00
Vicente Bolea
cf3c9bc921 Merge topic 'fix-compile_fix_for_sycl'
2ac236fe2 kokkos: disable volatile when kokkos >= 3.7

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2991
2023-02-18 18:35:41 -05:00
Vicente Adolfo Bolea Sanchez
2ac236fe21 kokkos: disable volatile when kokkos >= 3.7 2023-02-17 20:56:14 -05:00
Kenneth Moreland
383c3e1b60 Merge topic 'runtime-vec-array'
504d241b4 Correct documentation about `ArrayHandle`s with `Vec`-like values
cdd1dbd7b Add ArrayHandleRuntimeVec
a7679c9e9 Add more safety to VecTraits
da731005b Remove unused comments in test

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Sujin Philip <sujin.philip@kitware.com>
Merge-request: !2982
2023-02-17 13:35:47 -05:00
Kenneth Moreland
504d241b44 Correct documentation about ArrayHandles with Vec-like values 2023-02-16 12:46:34 -07:00
Kenneth Moreland
88004132c3 Compile UnitTestAbort.cxx with a normal C++ compiler
`UnitTestAbort.cxx` does not touch any code that needs to be compiled on
the device, so you do not need a device compiler. Use the standard C++
compiler instead.
2023-02-16 11:26:04 -07:00
Kenneth Moreland
cdd1dbd7bc Add ArrayHandleRuntimeVec
The new `ArrayHandleRuntimeVec` is a fancy `ArrayHandle` allows you to
specify a basic array of `Vec`s where the number of components of the `Vec`
are not known until runtime. (It can also optionally specify scalars.) The
behavior is much like that of `ArrayHandleGroupVecVariable` except that its
representation is much more constrained. This constrained representation
allows it to be automatically converted to an `ArrayHandleBasic` with the
proper `Vec` value type. This allows one part of code (such as a file
reader) to create an array with any `Vec` size, and then that array can be
fed to an algorithm that expects an `ArrayHandleBasic` of a certain value
type.
2023-02-16 07:04:10 -07:00
Kenneth Moreland
da731005b3 Remove unused comments in test 2023-02-16 07:04:10 -07:00
Mark Bolstad
be86a3f882 Merge topic 'compile_fix_for_sycl'
7d3ea2126 Changes for compiling with SYCL

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2986
2023-02-15 16:49:20 -05:00
Mark Bolstad
7d3ea2126d Changes for compiling with SYCL
- Remove volatile keyword from `join'
  - Remove various `printf' in device code
2023-02-15 14:38:59 -07:00
Sujin Philip
ec73ec36ee Merge topic 'fix-UnitTestAbort-warning'
a51cc2e15 Fix unreferenced local variable warning

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Kenneth Moreland <morelandkd@ornl.gov>
Merge-request: !2984
2023-02-14 10:51:41 -05:00
Sujin Philip
a51cc2e153 Fix unreferenced local variable warning 2023-02-13 13:29:26 -05:00
Sujin Philip
d05afa72f5 Merge topic 'vtkm-abort'
42c6959be Add Abort execution feature

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2974
2023-02-13 12:41:06 -05:00
Kenneth Moreland
a80de8019a Add support for getting vec sizes of unknown arrays when runtime selected
The `GetNumberOfComponents` and `GetNumberOfComponentsFlat` methods in
`UnknownArrayHandle` have been updated to correctly report the number of
components in special `ArrayHandle`s where the `Vec` sizes of the values
are not selected until runtime.

Previously, these methods always reported 0 because the value type could
not report the size of the `Vec`. The lookup has been modified to query the
`ArrayHandle`'s `Storage` for the number of components where supported.
Note that this only works on `Storage` that provides a method to get the
runtime `Vec` size. If that is not provided, as will be the case if the
number of components can vary from one value to the next, it will still
report 0.

This feature is implemented by looking for a method named
`GetNumberOfComponents` is the `Storage` class for the `ArrayHandle`. If
this method is found, it is used to query the size at runtime.
2023-02-09 11:53:52 -07:00
Sujin Philip
42c6959be3 Add Abort execution feature
Initial changes to add support for aborting execution.
2023-02-06 14:29:58 -05:00
Kenneth Moreland
0c13917c1e Change CellAverage to work on fields of any type
The previous version of the `CellAverage` filter used a float fallback
to handle most array types. The problem with this approach other than
converting field types perhaps unexpectantly is that it does not work
with every `Vec` size. This change uses the extract by component feature
of `UnknownArrayHandle` to handle every array type.

To implement this change the `CellAverage` worklet had to be changed to
handle recombined vecs. This change resulted in a feature degridation
where it can no longer be compiled for inputs of incompatible `Vec`
sizes. This feature dates back to when worklets like this were exposed
in the interface. This worklet class is now hidden away from the exposed
interface, so this degredation should not affect end users. There are
some unit tests that use this worklet to test other features, and these
had to be updated.
2023-02-03 14:51:40 -05:00
Kenneth Moreland
ce5ac9bfb0 Merge topic 'update-kokkos'
447b8e711 Fill input to test of array extract from stride array
726bb0910 Fix floating point exception in Kokkos sort
89245c3df Remove NUMA regions option
4912d1d04 Update --kokkos-threads to --kokkos-num-threads
9f77e1118 Do not test if Kokkos device id does not match
fa30d6774 Update the minimum Kokkos required to 3.7
3a96e9429 ci: update Kokkos docker images
674572419 Use Kokkos 3.7.1  in the CI builds

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Vicente Bolea <vicente.bolea@kitware.com>
Merge-request: !2967
2023-02-01 14:46:23 -05:00
Sujin Philip
ecb6f8d6d4 Merge topic 'refactor-runtimedevicetracker' into release-2.0
c7a2a7b30 Refactor RuntimeDeviceTracker

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2971
2023-01-31 10:44:50 -05:00
Sujin Philip
5fdb2cd770 Merge topic 'refactor-runtimedevicetracker'
c7a2a7b30 Refactor RuntimeDeviceTracker

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2971
2023-01-31 10:44:50 -05:00
Kenneth Moreland
447b8e711e Fill input to test of array extract from stride array
I was getting some floating point exceptions which may have come from
reading garbage as floating point values.
2023-01-30 09:53:57 -07:00
Kenneth Moreland
726bb09108 Fix floating point exception in Kokkos sort
THe current version of sort in Kokkos does not check whether the array
is of size 0, and that messes up its bin calculation. If the size of the
array is less than 2, skip the sort since the order cannot change.
2023-01-30 09:53:57 -07:00
Kenneth Moreland
89245c3df5 Remove NUMA regions option
This configuration option was only added because Kokkos has such a flag.
But this flag is now deprecated in Kokkos and has no effect, so remove
it from VTK-m.
2023-01-30 09:53:57 -07:00
Kenneth Moreland
4912d1d042 Update --kokkos-threads to --kokkos-num-threads
The former has been deprecated for the latter.
2023-01-30 09:53:57 -07:00
Kenneth Moreland
9f77e11185 Do not test if Kokkos device id does not match
There was a regression test to check for an exception if the requested
Kokkos device id did not match the `KOKKOS_DEVICE_ID` environment
variable. New versions of Kokkos do not throw an exception (they just
pick one over the other), so remove this check.
2023-01-30 09:53:57 -07:00
Sujin Philip
c7a2a7b30e Refactor RuntimeDeviceTracker
Simplifies the code by using modern C++ features
2023-01-30 09:41:19 -05:00
Kenneth Moreland
eda6dc39f2 Support using arrays with dynamic Vec-likes as output arrays
When you use an `ArrayHandle` as an output array in a worklet (for example,
as a `FieldOut`), the fetch operation does not read values from the array
during the `Load`. Instead, it just constructs a new object. This makes
sense as an output array is expected to have garbage in it anyway.

This is a problem for some special arrays that contain `Vec`-like objects
that are sized dynamically. For example, if you use an
`ArrayHandleGroupVecVariable`, each entry is a dynamically sized `Vec`. The
array is referenced by creating a special version of `Vec` that holds a
reference to the array portal and an index. Components are retrieved and
set by accessing the memory in the array portal. This allows us to have a
dynamically sized `Vec` in the execution environment without having to
allocate within the worklet.

The problem comes when we want to use one of these arrays with `Vec`-like
objects for an output. The typical fetch fails because you cannot construct
one of these `Vec`-like objects without an array portal to bind it to. In
these cases, we need the fetch to create the `Vec`-like object by reading
it from the array. Even though the data will be garbage, you get the
necessary buffer into the array (and nothing more).

Previously, the problem was fixed by creating partial specializations of
the `Fetch` for these `ArrayHandle`s. This worked OK as long as you were
using the array directly. However, the approach failed if the `ArrayHandle`
was wrapped in another `ArrayHandle` (for example, if an `ArrayHandleView`
was applied to an `ArrayHandleGroupVecVariable`).

To get around this problem and simplify things, the basic `Fetch` for
direct output arrays is changed to handle all cases where the values in the
`ArrayHandle` cannot be directly constructed. A compile-time check of the
array's value type is checked with `std::is_default_constructible`. If it
can be constructed, then the array is not accessed. If it cannot be
constructed, then it grabs a value out of the array.
2023-01-23 13:02:40 -07:00
Kenneth Moreland
679a61bb71 Merge topic 'resize-extracted-components'
23469cab6 Add ability to resize ArrayHandleRecombineVec
2061e95ef Add ability to resize ArrayHandleStride

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Li-Ta Lo <ollie@lanl.gov>
Merge-request: !2964
2023-01-23 14:09:10 -05:00
Vicente Bolea
ff340c268a Merge topic 'fix-testing-h' into release-2.0
a6f2a93c4 testing: remove vtkm/cont/testing relative path

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Kenneth Moreland <morelandkd@ornl.gov>
Merge-request: !2965
2023-01-20 02:13:27 -05:00
Vicente Bolea
caadd3248d Merge topic 'fix-testing-h'
a6f2a93c4 testing: remove vtkm/cont/testing relative path

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Kenneth Moreland <morelandkd@ornl.gov>
Merge-request: !2965
2023-01-20 02:13:27 -05:00
Vicente Adolfo Bolea Sanchez
a6f2a93c40 testing: remove vtkm/cont/testing relative path 2023-01-19 17:11:20 +09:00
Kenneth Moreland
23469cab68 Add ability to resize ArrayHandleRecombineVec
This feature enables the ability to anonomously create an array (such as
with `UnknownArrayHandle::NewInstance()`) and then use that as an output
array.
2023-01-18 14:29:23 -06:00
Kenneth Moreland
2061e95efe Add ability to resize ArrayHandleStride
This feature enables the ability to anonomously create an array (such as
with `UnknownArrayHandle::NewInstance()`) and then use that as an output
array. Although resizing `ArrayHandleStride` is a little wonky, it
allows worklets to resize them after creation rather than having to know
what size to make and allocating the array.
2023-01-18 14:29:23 -06:00
Kenneth Moreland
50a4935825 Merge topic 'document-field-index-order' into release-2.0
c0e0032e1 Clarify field index ordering in Doxygen

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2959
2023-01-13 11:14:36 -05:00
Kenneth Moreland
886f45078b Merge topic 'document-field-index-order'
c0e0032e1 Clarify field index ordering in Doxygen

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2959
2023-01-13 11:14:36 -05:00
Vicente Bolea
3a620941dd Merge topic 'fix-vtkm-devices-namespaces'
d5ce96789 CMAKE: fix vtkm devices namespaces

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Sujin Philip <sujin.philip@kitware.com>
Merge-request: !2953
2023-01-13 09:51:00 -05:00
Kenneth Moreland
c0e0032e1d Clarify field index ordering in Doxygen
The fields in a `DataSet` are indexed from `0` to `GetNumberOfFields() - 1`.
It is natural to assume that the fields will be indexed in the order that
they are added, but they are not. Rather, the indexing is arbitrary and can
change any time a field is added to the dataset.

To make this more clear, Doxygen documentation is added to the `DataSet`
methods to inform users to not make any assumptions about the order of
field indexing.
2023-01-10 10:42:49 -07:00
Kenneth Moreland
a3d7f9475b Force functions passed as templates to be functors
There are some special functions/methods that take as an argument a
function-like object and then call that function with some arguments.
There are some instances where a templated function was passed given the
appropriate template. Even though there is a specific function, this
gets passed as a function pointer and calling a function pointer on some
devices is a no-no.

Replace these function arguments with lambdas, which are constructed as
unnamed functor objects.
2023-01-03 13:56:29 -07:00
Vicente Adolfo Bolea Sanchez
d5ce967890 CMAKE: fix vtkm devices namespaces 2022-12-26 13:40:12 -05:00
Kenneth Moreland
99829cf617 Hide Particle class members
The member variables of the `vtkm::Particle` classes are now hidden. This
means that external code will not be directly able to access member
variables like `Pos`, `Time`, and `ID`. Instead, these need to be retrieved
and changed through accessor methods.

This follows standard C++ principles. It also helps us future-proof the
classes. It means that we can provide subclasses or alternate forms of
`Particle` that operate differently. It also makes it possible to change
interfaces while maintaining a deprecated interface.
2022-12-13 13:19:21 -05:00
Vicente Adolfo Bolea Sanchez
049d0cca8c cmake: namespace vtkm export targets 2022-12-09 18:46:56 -05:00