Rework ArrayHandleCuda to make it stop generate warnings

This commit is contained in:
Robert Maynard 2016-07-19 09:32:31 -04:00
parent 4ca6ce2ad6
commit 45ada6b55a
2 changed files with 67 additions and 18 deletions

@ -315,38 +315,44 @@ private:
namespace vtkm {
namespace cont {
namespace cuda {
/// A shortened name for our new array handle. Note: if ArrayHandleCuda is made
/// as a class that inherits from the below type, template resolution on array
/// handles that expect two template parameters goes awry (e.g. in the Field
/// constructor). When c++11 becomes the common convention, this should be
/// replaced with a templated alias.
/// ArrayHandleCuda is a specialization of ArrayHandle, which stores an
/// Array that has already been allocated inside CUDA
template <typename T>
struct ArrayHandleCuda
class ArrayHandleCuda
: public vtkm::cont::ArrayHandle <
T,
vtkm::cont::cuda::StorageTagCuda
>
{
typedef vtkm::cont::ArrayHandle<T,vtkm::cont::cuda::StorageTagCuda> type;
public:
VTKM_ARRAY_HANDLE_SUBCLASS(
ArrayHandleCuda,
(ArrayHandleCuda<T>),
(vtkm::cont::ArrayHandle<
T,
vtkm::cont::cuda::StorageTagCuda
>));
VTKM_CONT_EXPORT
ArrayHandleCuda(T *start,vtkm::Id length)
:Superclass( vtkm::cont::internal::Storage<T, vtkm::cont::cuda::StorageTagCuda>(start, length))
{
}
};
/// A convenience function for creating an ArrayHandle from a Cuda pointer.
///
template<typename T>
VTKM_CONT_EXPORT vtkm::cont::ArrayHandle<T,vtkm::cont::cuda::StorageTagCuda>
make_ArrayHandle(T *array,vtkm::Id length)
make_ArrayHandleCuda(T *array,vtkm::Id length)
{
typedef vtkm::cont::cuda::StorageTagCuda StorageTag;
typedef vtkm::cont::internal::Storage<T,StorageTag> StorageType;
typedef vtkm::cont::ArrayHandle<T,StorageTag> ArrayHandleType;
return ArrayHandleType(StorageType(array, length));
return ArrayHandleType(array, length);
}
} //namespace cuda
} //namespace cont
} //namespace vtkm
namespace vtkm {
namespace cont {
template<typename T>
VTKM_CONT_EXPORT
void
@ -358,6 +364,26 @@ printSummary_ArrayHandle(const vtkm::cont::ArrayHandle<T,
out<<"sz= "<<sz<<" [(on device)]";
}
} //namespace cont
} //namespace vtkm
namespace vtkm {
namespace cont {
namespace cuda {
template <typename T>
class ArrayHandle : public vtkm::cont::ArrayHandleCuda<T>
{
public:
VTKM_CONT_EXPORT
ArrayHandle(T *start,vtkm::Id length)
: vtkm::cont::ArrayHandleCuda<T>(start, length)
{
}
};
} //namespace cuda
} //namespace cont
} //namespace vtkm

@ -24,13 +24,36 @@
#define VTKM_DEVICE_ADAPTER VTKM_DEVICE_ADAPTER_ERROR
#include <vtkm/cont/cuda/DeviceAdapterCuda.h>
#include <vtkm/cont/cuda/ArrayHandleCuda.h>
#include <vtkm/cont/testing/TestingArrayHandles.h>
#include <vtkm/cont/cuda/internal/testing/Testing.h>
#include <vtkm/cont/Field.h>
//simple test to verify the array handle cuda compiles
void TestCudaHandle()
{
//Verify that we can construct a cuda array handle using the class inside
//the vtkm::cont::cuda namespace
vtkm::cont::cuda::ArrayHandle<vtkm::Id> handleFoo(NULL,0);
vtkm::cont::Field foo("foo", vtkm::cont::Field::ASSOC_CELL_SET , "cellset", handleFoo);
//Verify that we can construct a cuda array handle using the class inside
//the vtkm::cont namespace
vtkm::cont::ArrayHandleCuda< vtkm::Vec< vtkm::Float32, 3> > handleBar(NULL,0);
vtkm::cont::Field bar("bar", vtkm::cont::Field::ASSOC_CELL_SET, "cellset", handleBar);
}
int UnitTestCudaArrayHandle(int, char *[])
{
TestCudaHandle();
int result = vtkm::cont::testing::TestingArrayHandles
<vtkm::cont::DeviceAdapterTagCuda>::Run();
return vtkm::cont::cuda::internal::Testing::CheckCudaBeforeExit(result);
}