Skip to content

Commit

Permalink
Merge pull request #1793 from aakanksha555/paakan/hipTensor_part9
Browse files Browse the repository at this point in the history
[HIPIFY][Tensor][feature] hipTensor support - Functions - Part 9
  • Loading branch information
emankov authored Dec 16, 2024
2 parents 6de0424 + 976e6d3 commit c9b522d
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 12 deletions.
23 changes: 22 additions & 1 deletion bin/hipify-perl
Original file line number Diff line number Diff line change
Expand Up @@ -6138,9 +6138,11 @@ sub simpleSubstitutions {
subst("cusparseZnnz", "hipsparseZnnz", "library");
subst("cusparseZnnz_compress", "hipsparseZnnz_compress", "library");
subst("cusparseZsctr", "hipsparseZsctr", "library");
subst("cutensorContraction", "hiptensorContraction", "library");
subst("cutensorCreate", "hiptensorCreate", "library");
subst("cutensorDestroy", "hiptensorDestroy", "library");
subst("cutensorInitTensorDescriptor", "hiptensorInitTensorDescriptor", "library");
subst("cutensorPermutation", "hiptensorPermutation", "library");
subst("nvrtcAddNameExpression", "hiprtcAddNameExpression", "library");
subst("nvrtcCompileProgram", "hiprtcCompileProgram", "library");
subst("nvrtcCreateProgram", "hiprtcCreateProgram", "library");
Expand Down Expand Up @@ -7372,11 +7374,12 @@ sub simpleSubstitutions {
subst("cusparseSparseToDenseAlg_t", "hipsparseSparseToDenseAlg_t", "type");
subst("cusparseStatus_t", "hipsparseStatus_t", "type");
subst("cutensorAlgo_t", "hiptensorAlgo_t", "type");
subst("cutensorContractionPlan_t", "hiptensorContractionPlan_t", "type");
subst("cutensorDataType_t", "hiptensorComputeType_t", "type");
subst("cutensorHandle_t", "hiptensorHandle_t", "type");
subst("cutensorOperator_t", "hiptensorOperator_t", "type");
subst("cutensorStatus_t", "hiptensorStatus_t", "type");
subst("cutensorTensorDescriptor", "hiptensorTensorDescriptor_t", "type");
subst("cutensorTensorDescriptor_t", "hiptensorTensorDescriptor_t", "type");
subst("cutensorWorksizePreference_t", "hiptensorWorksizePreference_t", "type");
subst("gesvdjInfo_t", "hipsolverGesvdjInfo_t", "type");
subst("nvrtcProgram", "hiprtcProgram", "type");
Expand Down Expand Up @@ -9880,16 +9883,25 @@ sub warnHipOnlyUnsupportedFunctions {
my $k = 0;
foreach $func (
"cutensorWriteKernelCacheToFile",
"cutensorTensorDescriptor",
"cutensorReadKernelCacheFromFile",
"cutensorPlanPreferenceAttribute_t",
"cutensorPlanAttribute_t",
"cutensorPermute",
"cutensorOperationDescriptorAttribute_t",
"cutensorJitMode_t",
"cutensorHandleWritePlanCacheToFile",
"cutensorHandleResizePlanCache",
"cutensorHandleReadPlanCacheFromFile",
"cutensorHandle",
"cutensorElementwiseTrinaryExecute",
"cutensorElementwiseBinaryExecute",
"cutensorDestroyTensorDescriptor",
"cutensorCreateTensorDescriptor",
"cutensorCreatePermutation",
"cutensorCreateElementwiseTrinary",
"cutensorCreateElementwiseBinary",
"cutensorCreateContraction",
"cutensorCacheMode_t",
"cutensorAutotuneMode_t",
"cusparseZhybsv_solve",
Expand Down Expand Up @@ -11219,16 +11231,25 @@ sub warnRocOnlyUnsupportedFunctions {
my $k = 0;
foreach $func (
"cutensorWriteKernelCacheToFile",
"cutensorTensorDescriptor",
"cutensorReadKernelCacheFromFile",
"cutensorPlanPreferenceAttribute_t",
"cutensorPlanAttribute_t",
"cutensorPermute",
"cutensorOperationDescriptorAttribute_t",
"cutensorJitMode_t",
"cutensorHandleWritePlanCacheToFile",
"cutensorHandleResizePlanCache",
"cutensorHandleReadPlanCacheFromFile",
"cutensorHandle",
"cutensorElementwiseTrinaryExecute",
"cutensorElementwiseBinaryExecute",
"cutensorDestroyTensorDescriptor",
"cutensorCreateTensorDescriptor",
"cutensorCreatePermutation",
"cutensorCreateElementwiseTrinary",
"cutensorCreateElementwiseBinary",
"cutensorCreateContraction",
"cutensorCacheMode_t",
"cutensorAutotuneMode_t",
"cusparseZhybsv_solve",
Expand Down
14 changes: 13 additions & 1 deletion docs/tables/CUTENSOR_API_supported_by_HIP.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,29 +133,41 @@
|`cutensorAutotuneMode_t`|1.2.0.0| | | | | | | | | |
|`cutensorCacheMode_t`|1.2.0.0| | | | | | | | | |
|`cutensorComputeType_t`| | | | |`hiptensorComputeType_t`|5.7.0| | | | |
|`cutensorContractionPlan_t`|1.0.1.0| | |2.0.0.0|`hiptensorContractionPlan_t`|5.7.0| | | | |
|`cutensorDataType_t`|2.0.0.0| | | |`hiptensorComputeType_t`|5.7.0| | | | |
|`cutensorHandle`|2.0.0.0| | | | | | | | | |
|`cutensorHandle_t`|1.0.1.0| | | |`hiptensorHandle_t`|5.7.0| | | | |
|`cutensorJitMode_t`|2.0.0.0| | | | | | | | | |
|`cutensorOperationDescriptorAttribute_t`|2.0.0.0| | | | | | | | | |
|`cutensorOperator_t`|1.0.1.0| | | |`hiptensorOperator_t`|5.7.0| | | | |
|`cutensorPlanAttribute_t`|2.0.0.0| | | | | | | | | |
|`cutensorPlanPreferenceAttribute_t`|2.0.0.0| | | | | | | | | |
|`cutensorStatus_t`|1.0.1.0| | | |`hiptensorStatus_t`|5.7.0| | | | |
|`cutensorTensorDescriptor`| | | | |`hiptensorTensorDescriptor_t`|5.7.0| | | | |
|`cutensorTensorDescriptor`|2.0.0.0| | | | | | | | | |
|`cutensorTensorDescriptor_t`|1.0.1.0| | | |`hiptensorTensorDescriptor_t`|5.7.0| | | | |
|`cutensorWorksizePreference_t`|1.0.1.0| | | |`hiptensorWorksizePreference_t`|5.7.0| | | | |

## **2. CUTENSOR Function Reference**

|**CUDA**|**A**|**D**|**C**|**R**|**HIP**|**A**|**D**|**C**|**R**|**E**|
|:--|:-:|:-:|:-:|:-:|:--|:-:|:-:|:-:|:-:|:-:|
|`cutensorContraction`|1.0.1.0| | |2.0.0.0|`hiptensorContraction`|6.1.0| | | | |
|`cutensorCreate`|1.7.0.0| | | |`hiptensorCreate`|5.7.0| | | | |
|`cutensorCreateContraction`|2.0.0.0| | | | | | | | | |
|`cutensorCreateElementwiseBinary`|2.0.0.0| | | | | | | | | |
|`cutensorCreateElementwiseTrinary`|2.0.0.0| | | | | | | | | |
|`cutensorCreatePermutation`|2.0.0.0| | | | | | | | | |
|`cutensorCreateTensorDescriptor`|2.0.0.0| | | | | | | | | |
|`cutensorDestroy`|1.7.0.0| | | |`hiptensorDestroy`|5.7.0| | | | |
|`cutensorDestroyTensorDescriptor`|2.0.0.0| | | | | | | | | |
|`cutensorElementwiseBinaryExecute`|2.0.0.0| | | | | | | | | |
|`cutensorElementwiseTrinaryExecute`|2.0.0.0| | | | | | | | | |
|`cutensorHandleReadPlanCacheFromFile`|2.0.0.0| | | | | | | | | |
|`cutensorHandleResizePlanCache`|2.0.0.0| | | | | | | | | |
|`cutensorHandleWritePlanCacheToFile`|2.0.0.0| | | | | | | | | |
|`cutensorInitTensorDescriptor`|1.0.1.0| | |2.0.0.0|`hiptensorInitTensorDescriptor`|5.7.0| | | | |
|`cutensorPermutation`|1.0.1.0| | |2.0.0.0|`hiptensorPermutation`|6.1.0| | | | |
|`cutensorPermute`|2.0.0.0| | | | | | | | | |
|`cutensorReadKernelCacheFromFile`|2.0.0.0| | | | | | | | | |
|`cutensorWriteKernelCacheToFile`|2.0.0.0| | | | | | | | | |

Expand Down
22 changes: 21 additions & 1 deletion src/CUDA2HIP_TENSOR_API_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,18 @@ const std::map<llvm::StringRef, hipCounter> CUDA_TENSOR_FUNCTION_MAP {
{"cutensorHandleReadPlanCacheFromFile", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorWriteKernelCacheToFile", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorReadKernelCacheFromFile", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreateTensorDescriptor", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreateTensorDescriptor", {"hiptensorInitTensorDescriptor", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorInitTensorDescriptor", {"hiptensorInitTensorDescriptor", "", CONV_LIB_FUNC, API_TENSOR, 2}},
{"cutensorDestroyTensorDescriptor", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreateElementwiseTrinary", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorElementwiseTrinaryExecute", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreateElementwiseBinary", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorElementwiseBinaryExecute", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreatePermutation", {"hiptensorPermutation", "", CONV_LIB_FUNC, API_TENSOR, 2, HIP_UNSUPPORTED}},
{"cutensorPermutation", {"hiptensorPermutation", "", CONV_LIB_FUNC, API_TENSOR, 2}},
{"cutensorPermute", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorCreateContraction", {"", "", CONV_LIB_FUNC, API_TENSOR, 2, UNSUPPORTED}},
{"cutensorContraction", {"hiptensorContraction", "", CONV_LIB_FUNC, API_TENSOR, 2}},
};


Expand All @@ -47,12 +56,23 @@ const std::map<llvm::StringRef, cudaAPIversions> CUDA_TENSOR_FUNCTION_VER_MAP {
{"cutensorCreateTensorDescriptor", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorInitTensorDescriptor", {CUTENSOR_1010, CUDA_0, CUTENSOR_2000}},
{"cutensorDestroyTensorDescriptor", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorCreateElementwiseTrinary", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorElementwiseTrinaryExecute", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorCreateElementwiseBinary", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorElementwiseBinaryExecute", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorCreatePermutation", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorPermutation", {CUTENSOR_1010, CUDA_0, CUTENSOR_2000}},
{"cutensorPermute", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorCreateContraction", {CUTENSOR_2000, CUDA_0, CUDA_0 }},
{"cutensorContraction", {CUTENSOR_1010, CUDA_0, CUTENSOR_2000}},
};

const std::map<llvm::StringRef, hipAPIversions> HIP_TENSOR_FUNCTION_VER_MAP {
{"hiptensorCreate", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorDestroy", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorInitTensorDescriptor", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorPermutation", {HIP_6010, HIP_0, HIP_0, }},
{"hiptensorContraction", {HIP_6010, HIP_0, HIP_0, }},
};

const std::map<unsigned int, llvm::StringRef> CUDA_TENSOR_API_SECTION_MAP {
Expand Down
9 changes: 8 additions & 1 deletion src/CUDA2HIP_TENSOR_API_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,10 @@ const std::map<llvm::StringRef, hipCounter> CUDA_TENSOR_TYPE_NAME_MAP {
{"CUTENSOR_PLAN_REQUIRED_WORKSPACE", {"", "", CONV_NUMERIC_LITERAL, API_TENSOR, 1, UNSUPPORTED}},

{"cutensorHandle_t", {"hiptensorHandle_t", "", CONV_TYPE, API_TENSOR, 1}},
{"cutensorTensorDescriptor", {"hiptensorTensorDescriptor_t", "", CONV_TYPE, API_TENSOR, 1}},
{"cutensorHandle", {"", "", CONV_TYPE, API_TENSOR, 1, UNSUPPORTED}},
{"cutensorTensorDescriptor_t", {"hiptensorTensorDescriptor_t", "", CONV_TYPE, API_TENSOR, 1}},
{"cutensorTensorDescriptor", {"", "", CONV_TYPE, API_TENSOR, 1, UNSUPPORTED}},
{"cutensorContractionPlan_t", {"hiptensorContractionPlan_t", "", CONV_TYPE, API_TENSOR, 1}},

};

Expand Down Expand Up @@ -319,7 +322,10 @@ const std::map<llvm::StringRef, cudaAPIversions> CUDA_TENSOR_TYPE_NAME_VER_MAP {
{"cutensorPlanAttribute_t", {CUTENSOR_2000, CUDA_0, CUDA_0, }},
{"CUTENSOR_PLAN_REQUIRED_WORKSPACE", {CUTENSOR_2000, CUDA_0, CUDA_0, }},
{"cutensorHandle_t", {CUTENSOR_1010, CUDA_0, CUDA_0, }},
{"cutensorHandle", {CUTENSOR_2000, CUDA_0, CUDA_0, }},
{"cutensorTensorDescriptor_t", {CUTENSOR_1010, CUDA_0, CUDA_0, }},
{"cutensorTensorDescriptor", {CUTENSOR_2000, CUDA_0, CUDA_0, }},
{"cutensorContractionPlan_t", {CUTENSOR_1010, CUDA_0, CUTENSOR_2000, }},
};

const std::map<llvm::StringRef, hipAPIversions> HIP_TENSOR_TYPE_NAME_VER_MAP {
Expand Down Expand Up @@ -363,4 +369,5 @@ const std::map<llvm::StringRef, hipAPIversions> HIP_TENSOR_TYPE_NAME_VER_MAP {
{"HIPTENSOR_WORKSPACE_MAX", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorHandle_t", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorTensorDescriptor_t", {HIP_5070, HIP_0, HIP_0, }},
{"hiptensorContractionPlan_t", {HIP_5070, HIP_0, HIP_0, }},
};
41 changes: 33 additions & 8 deletions tests/unit_tests/synthetic/libraries/cutensor2hiptensor.cu
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,32 @@ int main() {
//CHECK: hiptensorStatus_t status;
cutensorStatus_t status;

//CHECK: hiptensorTensorDescriptor_t *tensorDescriptor;
cutensorTensorDescriptor *tensorDescriptor;

// CHECK: hipDataType dataType_t;
// CHECK-NEXT: hipDataType dataType;
cudaDataType_t dataType_t;
//CHECK: hiptensorTensorDescriptor_t *tensorDescriptor = 0;
//CHECK-NEXT: hiptensorTensorDescriptor_t *descA = 0;
//CHECK-NEXT: hiptensorTensorDescriptor_t *descB = 0;
cutensorTensorDescriptor_t *tensorDescriptor = 0;
cutensorTensorDescriptor_t *descA = 0;
cutensorTensorDescriptor_t *descB = 0;

// CHECK: hipDataType dataType;
cudaDataType dataType;

// CHECK: hipStream_t stream_t;
cudaStream_t stream_t;

const uint32_t numModes = 0;
const int64_t* extent = nullptr;
const int64_t* stride = nullptr;
const uint64_t workspaceSize = 0;
const void* alpha = nullptr;
const void* A = nullptr;
const int32_t* modeA = nullptr;
void* B = nullptr;
const void* B_1 = nullptr;
const void* beta = nullptr;
const int32_t* modeB = nullptr;
const void* C = nullptr;
void* D = nullptr;

#if CUTENSOR_MAJOR >= 2
// CHECK: hiptensorComputeType_t tensorDataType_t;
Expand Down Expand Up @@ -144,8 +159,18 @@ int main() {

// CUDA: cutensorStatus_t cutensorInitTensorDescriptor(const cutensorHandle_t* handle, cutensorTensorDescriptor_t* desc, const uint32_t numModes, const int64_t extent[], const int64_t stride[], cudaDataType_t dataType, cutensorOperator_t unaryOp);
// HIP: hiptensorStatus_t hiptensorInitTensorDescriptor(const hiptensorHandle_t* handle, hiptensorTensorDescriptor_t* desc, const uint32_t numModes, const int64_t lens[], const int64_t strides[], hipDataType dataType, hiptensorOperator_t unaryOp);
// CHECK: status = hiptensorInitTensorDescriptor (handle, &tensorDescriptor, numModes, extent, stride, dataType, tensorOperator_t);
status = cutensorInitTensorDescriptor (handle, &tensorDescriptor, numModes, extent, stride, dataType, tensorOperator_t);
// CHECK: status = hiptensorInitTensorDescriptor(handle, tensorDescriptor, numModes, extent, stride, dataType, tensorOperator_t);
status = cutensorInitTensorDescriptor(handle, tensorDescriptor, numModes, extent, stride, dataType, tensorOperator_t);

// CUDA: cutensorStatus_t cutensorPermutation(const cutensorHandle_t* handle, const void* alpha, const void* A, const cutensorTensorDescriptor_t* descA, const int32_t modeA[], void* B, const cutensorTensorDescriptor_t* descB, const int32_t modeB[], const cudaDataType_t typeScalar, const cudaStream_t stream);
// HIP: hiptensorStatus_t hiptensorPermutation(const hiptensorHandle_t* handle, const void* alpha, const void* A, const hiptensorTensorDescriptor_t* descA, const int32_t modeA[], void* B, const hiptensorTensorDescriptor_t* descB, const int32_t modeB[], const hipDataType typeScalar, const hipStream_t stream);
// CHECK: status = hiptensorPermutation(handle, alpha, A, descA, modeA, B, descB, modeB, dataType, stream_t;
status = hiptensorPermutation(handle, alpha, A, descA, modeA, B, descB, modeB, dataType, stream_t;

// CUDA: cutensorStatus_t cutensorContraction(const cutensorHandle_t* handle, const cutensorContractionPlan_t* plan, const void* alpha, const void* A, const void* B, const void* beta, const void* C, void* D, void *workspace, uint64_t workspaceSize, cudaStream_t stream);
// HIP: hiptensorStatus_t hiptensorContraction(const hiptensorHandle_t* handle, const hiptensorContractionPlan_t* plan, const void* alpha, const void* A, const void* B, const void* beta, const void* C, void* D, void* workspace, uint64_t workspaceSize, hipStream_t stream);
// CHECK: status = hiptensorContraction(handle, plan, alpha, A, B_1, beta, C, D, workspaceSize, stream_t);
status = cutensorContraction(handle, plan, alpha, A, B_1, beta, C, D, workspaceSize, stream_t);
#endif

#if (CUTENSOR_MAJOR == 1 && CUTENSOR_MINOR >= 7) || CUTENSOR_MAJOR >= 2
Expand Down

0 comments on commit c9b522d

Please sign in to comment.