I am done

This commit is contained in:
2024-10-30 22:14:35 +01:00
parent 720dc28c09
commit 40e2a747cf
36901 changed files with 5011519 additions and 0 deletions

View File

@ -0,0 +1,146 @@
#pragma once
#include <ATen/miopen/Exceptions.h>
#include <ATen/miopen/miopen-wrapper.h>
#include <ATen/core/Tensor.h>
#include <ATen/TensorUtils.h>
namespace at { namespace native {
inline int dataSize(miopenDataType_t dataType)
{
switch (dataType) {
case miopenHalf: return 2;
case miopenFloat: return 4;
case miopenBFloat16: return 2;
default: return 8;
}
}
template <typename T, miopenStatus_t (*dtor)(T*)>
struct DescriptorDeleter {
void operator()(T* x) {
if (x != nullptr) {
MIOPEN_CHECK(dtor(x));
}
}
};
// A generic class for wrapping MIOpen descriptor types. All you need
// is to give the underlying type the Descriptor_t points to (usually,
// if it's miopenTensorDescriptor_t it points to miopenTensorStruct),
// the constructor and the destructor. Subclasses are responsible
// for defining a set() function to actually set the descriptor.
//
// Descriptors default construct to a nullptr, and have a descriptor
// initialized the first time you call set() or any other initializing
// function.
template <typename T, miopenStatus_t (*ctor)(T**), miopenStatus_t (*dtor)(T*)>
class Descriptor
{
public:
// Use desc() to access the underlying descriptor pointer in
// a read-only fashion. Most client code should use this.
// If the descriptor was never initialized, this will return
// nullptr.
T* desc() const { return desc_.get(); }
T* desc() { return desc_.get(); }
// Use mut_desc() to access the underlying descriptor pointer
// if you intend to modify what it points to (e.g., using
// miopenSetFooDescriptor). This will ensure that the descriptor
// is initialized. Code in this file will use this function.
T* mut_desc() { init(); return desc_.get(); }
protected:
void init() {
if (desc_ == nullptr) {
T* raw_desc;
MIOPEN_CHECK(ctor(&raw_desc));
desc_.reset(raw_desc);
}
}
private:
std::unique_ptr<T, DescriptorDeleter<T, dtor>> desc_;
};
class TensorDescriptor
: public Descriptor<miopenTensorDescriptor,
&miopenCreateTensorDescriptor,
&miopenDestroyTensorDescriptor>
{
public:
TensorDescriptor() {}
explicit TensorDescriptor(const at::Tensor &t, size_t pad = 0) {
set(t, pad);
}
void set(const at::Tensor &t, size_t pad = 0);
void set(miopenDataType_t dataType, IntArrayRef sizes, IntArrayRef strides, size_t pad = 0);
void print();
private:
void set(miopenDataType_t dataType, int dim, int* size, int* stride) {
MIOPEN_CHECK(miopenSetTensorDescriptor(mut_desc(), dataType, dim, size, stride));
}
};
std::ostream& operator<<(std::ostream & out, const TensorDescriptor& d);
class FilterDescriptor
: public Descriptor<miopenTensorDescriptor,
&miopenCreateTensorDescriptor,
&miopenDestroyTensorDescriptor>
{
public:
void set(const at::Tensor &t, int64_t pad = 0) {
set(t, at::MemoryFormat::Contiguous, pad);
}
void set(const at::Tensor &t, const at::MemoryFormat memory_format, int64_t pad = 0);
private:
void set(miopenDataType_t dataType, int dim, int* size, int* stride) {
MIOPEN_CHECK(miopenSetTensorDescriptor(mut_desc(), dataType, dim, size, stride));
}
};
struct ConvolutionDescriptor
: public Descriptor<miopenConvolutionDescriptor,
&miopenCreateConvolutionDescriptor,
&miopenDestroyConvolutionDescriptor>
{
void set(miopenDataType_t dataType, miopenConvolutionMode_t c_mode, int dim, int* pad, int* stride, int * upscale /* aka dilation */, int groups, bool deterministic) {
MIOPEN_CHECK(miopenInitConvolutionNdDescriptor(mut_desc(), dim, pad, stride, upscale, c_mode));
MIOPEN_CHECK(miopenSetConvolutionGroupCount(mut_desc(), groups));
MIOPEN_CHECK(miopenSetConvolutionAttribute(mut_desc(), MIOPEN_CONVOLUTION_ATTRIB_DETERMINISTIC, deterministic ? 1 : 0));
}
};
struct RNNDescriptor
: public Descriptor<miopenRNNDescriptor,
&miopenCreateRNNDescriptor,
&miopenDestroyRNNDescriptor>
{
void set(int64_t hidden_size, int64_t num_layers, miopenRNNInputMode_t input_mode, miopenRNNDirectionMode_t direction, miopenRNNMode_t rnn_mode,
miopenRNNBiasMode_t bias_mode, miopenRNNAlgo_t algorithm, miopenDataType_t datatype) {
MIOPEN_CHECK(miopenSetRNNDescriptor(mut_desc(), hidden_size, num_layers, input_mode, direction, rnn_mode, bias_mode, algorithm, datatype));
}
};
union Constant
{
float f;
double d;
Constant(miopenDataType_t dataType, double value) {
if (dataType == miopenHalf || dataType == miopenFloat || dataType == miopenBFloat16) {
f = static_cast<float>(value);
} else {
d = value;
}
}
};
}} // namespace

View File

@ -0,0 +1,41 @@
#pragma once
#include <ATen/miopen/miopen-wrapper.h>
#include <string>
#include <stdexcept>
#include <sstream>
namespace at { namespace native {
class miopen_exception : public std::runtime_error {
public:
miopenStatus_t status;
miopen_exception(miopenStatus_t status, const char* msg)
: std::runtime_error(msg)
, status(status) {}
miopen_exception(miopenStatus_t status, const std::string& msg)
: std::runtime_error(msg)
, status(status) {}
};
inline void MIOPEN_CHECK(miopenStatus_t status)
{
if (status != miopenStatusSuccess) {
if (status == miopenStatusNotImplemented) {
throw miopen_exception(status, std::string(miopenGetErrorString(status)) +
". This error may appear if you passed in a non-contiguous input.");
}
throw miopen_exception(status, miopenGetErrorString(status));
}
}
inline void HIP_CHECK(hipError_t error)
{
if (error != hipSuccess) {
std::string msg("HIP error: ");
msg += hipGetErrorString(error);
throw std::runtime_error(msg);
}
}
}} // namespace at::native

View File

@ -0,0 +1,9 @@
#pragma once
#include <ATen/miopen/miopen-wrapper.h>
namespace at { namespace native {
miopenHandle_t getMiopenHandle();
}} // namespace

View File

@ -0,0 +1,12 @@
#pragma once
#include <ATen/miopen/miopen-wrapper.h>
#include <ATen/Tensor.h>
namespace at { namespace native {
miopenDataType_t getMiopenDataType(const at::Tensor& tensor);
int64_t miopen_version();
}} // namespace at::miopen

View File

@ -0,0 +1,18 @@
#pragma once
#include <ATen/core/Tensor.h>
#include <ATen/miopen/miopen-wrapper.h>
#include <ATen/miopen/Handle.h>
namespace at { namespace native {
// This function makes tensors which have zero stride contiguous, by
// setting the strides to 1.
inline Tensor contiguousIfZeroInStrides(const Tensor& t) {
for (auto s : t.strides()) {
if (s == 0) return t.contiguous();
}
return t;
}
}}

View File

@ -0,0 +1,3 @@
#pragma once
#include <miopen/miopen.h>