diff --git a/mlir/test/CMakeLists.txt b/mlir/test/CMakeLists.txt index 91bad3331dca..65235fee23b5 100644 --- a/mlir/test/CMakeLists.txt +++ b/mlir/test/CMakeLists.txt @@ -1,80 +1,80 @@ add_subdirectory(EDSC) add_subdirectory(mlir-cpu-runner) add_subdirectory(SDBM) add_subdirectory(lib) llvm_canonicalize_cmake_booleans( LLVM_BUILD_EXAMPLES ) # Passed to lit.site.cfg.py.in to set up the path where to find the libraries # for linalg integration tests. set(MLIR_DIALECT_LINALG_INTEGRATION_TEST_LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) set(MLIR_RUNNER_UTILS_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) # Passed to lit.site.cfg.py.in to set up the path where to find the libraries # for the mlir cuda runner tests. set(MLIR_CUDA_WRAPPER_LIBRARY_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) set(MLIR_VULKAN_WRAPPER_LIBRARY_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py MAIN_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py ) configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py MAIN_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py ) set(MLIR_TEST_DEPENDS FileCheck count not MLIRUnitTests mlir-cpu-runner mlir-edsc-builder-api-test mlir-opt mlir-sdbm-api-test mlir-tblgen mlir-translate - cblas - cblas_interface + mlir_test_cblas + mlir_test_cblas_interface mlir_runner_utils mlir_c_runner_utils ) if(LLVM_BUILD_EXAMPLES) list(APPEND MLIR_TEST_DEPENDS toyc-ch1 toyc-ch2 toyc-ch3 toyc-ch4 toyc-ch5 toyc-ch6 toyc-ch7 ) endif() if(MLIR_CUDA_RUNNER_ENABLED) list(APPEND MLIR_TEST_DEPENDS mlir-cuda-runner ) endif() if(MLIR_VULKAN_RUNNER_ENABLED) list(APPEND MLIR_TEST_DEPENDS mlir-vulkan-runner ) endif() add_lit_testsuite(check-mlir "Running the MLIR regression tests" ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${MLIR_TEST_DEPENDS} ) set_target_properties(check-mlir PROPERTIES FOLDER "Tests") add_lit_testsuites(MLIR ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${MLIR_TEST_DEPS} ) diff --git a/mlir/test/mlir-cpu-runner/CMakeLists.txt b/mlir/test/mlir-cpu-runner/CMakeLists.txt index a9d45f0f7f8b..62f395271855 100644 --- a/mlir/test/mlir-cpu-runner/CMakeLists.txt +++ b/mlir/test/mlir-cpu-runner/CMakeLists.txt @@ -1,12 +1,12 @@ set(LLVM_OPTIONAL_SOURCES - cblas.cpp - cblas_interface.cpp + mlir_test_cblas.cpp + mlir_test_cblas_interface.cpp ) -add_llvm_library(cblas SHARED cblas.cpp) -target_compile_definitions(cblas PRIVATE cblas_EXPORTS) +add_llvm_library(mlir_test_cblas SHARED mlir_test_cblas.cpp) +target_compile_definitions(mlir_test_cblas PRIVATE mlir_test_cblas_EXPORTS) -add_llvm_library(cblas_interface SHARED cblas_interface.cpp) -target_link_libraries(cblas_interface PRIVATE cblas) -target_compile_definitions(cblas_interface PRIVATE cblas_interface_EXPORTS) +add_llvm_library(mlir_test_cblas_interface SHARED mlir_test_cblas_interface.cpp) +target_link_libraries(mlir_test_cblas_interface PRIVATE mlir_test_cblas) +target_compile_definitions(mlir_test_cblas_interface PRIVATE mlir_test_cblas_interface_EXPORTS) diff --git a/mlir/test/mlir-cpu-runner/include/cblas.h b/mlir/test/mlir-cpu-runner/include/cblas.h deleted file mode 100644 index 2b57091f2fe9..000000000000 --- a/mlir/test/mlir-cpu-runner/include/cblas.h +++ /dev/null @@ -1,49 +0,0 @@ -//===- cblas.h - Simple Blas subset ---------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -#ifndef MLIR_CPU_RUNNER_CBLAS_H_ -#define MLIR_CPU_RUNNER_CBLAS_H_ - -#include "mlir/ExecutionEngine/RunnerUtils.h" - -#ifdef _WIN32 -#ifndef MLIR_CBLAS_EXPORT -#ifdef cblas_EXPORTS -/* We are building this library */ -#define MLIR_CBLAS_EXPORT __declspec(dllexport) -#else -/* We are using this library */ -#define MLIR_CBLAS_EXPORT __declspec(dllimport) -#endif // cblas_EXPORTS -#endif // MLIR_CBLAS_EXPORT -#else -#define MLIR_CBLAS_EXPORT -#endif // _WIN32 - -/// This reproduces a minimal subset of cblas to allow integration testing -/// without explicitly requiring a dependence on an external library. -/// Without loss of generality, various cblas implementations may be swapped in -/// by including the proper headers and linking with the proper library. -enum CBLAS_ORDER { CblasRowMajor = 101, CblasColMajor = 102 }; -enum CBLAS_TRANSPOSE { - CblasNoTrans = 111, - CblasTrans = 112, - CblasConjTrans = 113 -}; - -extern "C" MLIR_CBLAS_EXPORT float cblas_sdot(const int N, const float *X, - const int incX, const float *Y, - const int incY); - -extern "C" MLIR_CBLAS_EXPORT void -cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, - const enum CBLAS_TRANSPOSE TransB, const int M, const int N, - const int K, const float alpha, const float *A, const int lda, - const float *B, const int ldb, const float beta, float *C, - const int ldc); - -#endif // MLIR_CPU_RUNNER_CBLAS_H_ diff --git a/mlir/test/mlir-cpu-runner/include/mlir_test_cblas.h b/mlir/test/mlir-cpu-runner/include/mlir_test_cblas.h new file mode 100644 index 000000000000..e5dad70948e4 --- /dev/null +++ b/mlir/test/mlir-cpu-runner/include/mlir_test_cblas.h @@ -0,0 +1,49 @@ +//===- mlir_test_cblas.h - Simple Blas subset -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_H_ +#define MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_H_ + +#include "mlir/ExecutionEngine/RunnerUtils.h" + +#ifdef _WIN32 +#ifndef MLIR_TEST_CBLAS_EXPORT +#ifdef mlir_test_cblas_EXPORTS +/* We are building this library */ +#define MLIR_TEST_CBLAS_EXPORT __declspec(dllexport) +#else +/* We are using this library */ +#define MLIR_TEST_CBLAS_EXPORT __declspec(dllimport) +#endif // mlir_test_cblas_EXPORTS +#endif // MLIR_TEST_CBLAS_EXPORT +#else +#define MLIR_TEST_CBLAS_EXPORT +#endif // _WIN32 + +/// This reproduces a minimal subset of mlir_test_cblas to allow integration +/// testing without explicitly requiring a dependence on an external library. +/// Without loss of generality, various mlir_test_cblas implementations may be +/// swapped in by including the proper headers and linking with the proper +/// library. +enum CBLAS_ORDER { CblasRowMajor = 101, CblasColMajor = 102 }; +enum CBLAS_TRANSPOSE { + CblasNoTrans = 111, + CblasTrans = 112, + CblasConjTrans = 113 +}; + +extern "C" MLIR_TEST_CBLAS_EXPORT float +mlir_test_cblas_sdot(const int N, const float *X, const int incX, + const float *Y, const int incY); + +extern "C" MLIR_TEST_CBLAS_EXPORT void mlir_test_cblas_sgemm( + const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, + const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, + const float alpha, const float *A, const int lda, const float *B, + const int ldb, const float beta, float *C, const int ldc); + +#endif // MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_H_ diff --git a/mlir/test/mlir-cpu-runner/include/cblas_interface.h b/mlir/test/mlir-cpu-runner/include/mlir_test_cblas_interface.h similarity index 60% rename from mlir/test/mlir-cpu-runner/include/cblas_interface.h rename to mlir/test/mlir-cpu-runner/include/mlir_test_cblas_interface.h index 50edbe730d56..c09c214fde51 100644 --- a/mlir/test/mlir-cpu-runner/include/cblas_interface.h +++ b/mlir/test/mlir-cpu-runner/include/mlir_test_cblas_interface.h @@ -1,59 +1,59 @@ -//===- cblas_interface.h - Simple Blas subset interface -------------------===// +//===- mlir_test_cblas_interface.h - Simple Blas subset interface ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -#ifndef MLIR_CPU_RUNNER_CBLAS_INTERFACE_H_ -#define MLIR_CPU_RUNNER_CBLAS_INTERFACE_H_ +#ifndef MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_INTERFACE_H_ +#define MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_INTERFACE_H_ #include "mlir/ExecutionEngine/RunnerUtils.h" #ifdef _WIN32 -#ifndef MLIR_CBLAS_INTERFACE_EXPORT -#ifdef cblas_interface_EXPORTS +#ifndef MLIR_TEST_CBLAS_INTERFACE_EXPORT +#ifdef mlir_test_cblas_interface_EXPORTS /* We are building this library */ -#define MLIR_CBLAS_INTERFACE_EXPORT __declspec(dllexport) +#define MLIR_TEST_CBLAS_INTERFACE_EXPORT __declspec(dllexport) #else /* We are using this library */ -#define MLIR_CBLAS_INTERFACE_EXPORT __declspec(dllimport) -#endif // cblas_interface_EXPORTS -#endif // MLIR_CBLAS_INTERFACE_EXPORT +#define MLIR_TEST_CBLAS_INTERFACE_EXPORT __declspec(dllimport) +#endif // mlir_test_cblas_interface_EXPORTS +#endif // MLIR_TEST_CBLAS_INTERFACE_EXPORT #else -#define MLIR_CBLAS_INTERFACE_EXPORT +#define MLIR_TEST_CBLAS_INTERFACE_EXPORT #endif // _WIN32 -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_fill_viewf32_f32(StridedMemRefType *X, float f); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_fill_viewsxf32_f32(StridedMemRefType *X, float f); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_fill_viewsxsxf32_f32(StridedMemRefType *X, float f); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_copy_viewf32_viewf32(StridedMemRefType *I, StridedMemRefType *O); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_copy_viewsxf32_viewsxf32(StridedMemRefType *I, StridedMemRefType *O); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_copy_viewsxsxf32_viewsxsxf32( StridedMemRefType *I, StridedMemRefType *O); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_dot_viewsxf32_viewsxf32_viewf32( StridedMemRefType *X, StridedMemRefType *Y, StridedMemRefType *Z); -extern "C" MLIR_CBLAS_INTERFACE_EXPORT void +extern "C" MLIR_TEST_CBLAS_INTERFACE_EXPORT void _mlir_ciface_linalg_matmul_viewsxsxf32_viewsxsxf32_viewsxsxf32( StridedMemRefType *A, StridedMemRefType *B, StridedMemRefType *C); -#endif // MLIR_CPU_RUNNER_CBLAS_INTERFACE_H_ +#endif // MLIR_CPU_RUNNER_MLIR_TEST_CBLAS_INTERFACE_H_ diff --git a/mlir/test/mlir-cpu-runner/linalg_integration_test.mlir b/mlir/test/mlir-cpu-runner/linalg_integration_test.mlir index c7676f7031f3..6c143e66a273 100644 --- a/mlir/test/mlir-cpu-runner/linalg_integration_test.mlir +++ b/mlir/test/mlir-cpu-runner/linalg_integration_test.mlir @@ -1,83 +1,100 @@ -// RUN: mlir-opt %s -convert-linalg-to-llvm | mlir-cpu-runner -e dot -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s -// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm | mlir-cpu-runner -e dot -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s -// RUN: mlir-opt %s -convert-linalg-to-llvm | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s -// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s -// RUN: mlir-opt %s -linalg-tile="linalg-tile-sizes=2,3,4" -linalg-promote-subviews -convert-linalg-to-loops -convert-linalg-to-llvm | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s -// RUN: mlir-opt %s -linalg-tile="linalg-tile-sizes=2,3,4" -linalg-promote-subviews -convert-linalg-to-llvm | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s +// RUN: mlir-opt %s -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e dot -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s + +// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e dot -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s + +// RUN: mlir-opt %s -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s + +// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s + +// RUN: mlir-opt %s -linalg-tile="linalg-tile-sizes=2,3,4" -linalg-promote-subviews -convert-linalg-to-loops -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s + +// RUN: mlir-opt %s -linalg-tile="linalg-tile-sizes=2,3,4" -linalg-promote-subviews -convert-linalg-to-llvm \ +// RUN: | mlir-cpu-runner -e matmul -entry-point-result=f32 -shared-libs=%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext \ +// RUN: | FileCheck %s #strided1D = affine_map<(d0) -> (d0)> #strided2D = affine_map<(d0, d1)[s0] -> (d0 * s0 + d1)> // Creates and returns a 1-D buffer of size %s filled with the value %f func @alloc_filled_f32(%s : index, %f : f32) -> memref { %c0 = constant 0 : index %c1 = constant 1 : index %c4 = constant 4 : index %s4 = muli %s, %c4: index %buf = alloc(%s4) {alignment = 256} : memref %V = view %buf[%s][] : memref to memref linalg.fill(%V, %f) : memref, f32 return %buf : memref } // Test for linalg.dot. func @dot() -> f32 { %c0 = constant 0 : index %c1 = constant 1 : index %c16 = constant 16 : index %f10 = constant 10.00000e+00 : f32 %f1 = constant 1.00000e+00 : f32 %f2 = constant 2.00000e+00 : f32 %bA = call @alloc_filled_f32(%c16, %f2) : (index, f32) -> (memref) %bB = call @alloc_filled_f32(%c16, %f1) : (index, f32) -> (memref) %bC = call @alloc_filled_f32(%c1, %f10) : (index, f32) -> (memref) %A = view %bA[%c16][] : memref to memref %B = view %bB[%c16][] : memref to memref %C = view %bC[][] : memref to memref linalg.dot(%A, %B, %C) : memref, memref, memref %res = load %C[] : memref dealloc %bC : memref dealloc %bB : memref dealloc %bA : memref return %res : f32 } // Test for linalg.matmul. func @matmul() -> f32 { %c0 = constant 0 : index %c1 = constant 1 : index %c6 = constant 6 : index %c7 = constant 7 : index %c10 = constant 10 : index %c16 = constant 16 : index %c100 = constant 100 : index %c160 = constant 160 : index %f1 = constant 1.00000e+00 : f32 %f2 = constant 2.00000e+00 : f32 %f10 = constant 10.00000e+00 : f32 %bA = call @alloc_filled_f32(%c160, %f2) : (index, f32) -> (memref) %bB = call @alloc_filled_f32(%c160, %f1) : (index, f32) -> (memref) %bC = call @alloc_filled_f32(%c100, %f10) : (index, f32) -> (memref) %A = view %bA[][%c10, %c16] : memref to memref %B = view %bB[][%c16, %c10] : memref to memref %C = view %bC[][%c10, %c10] : memref to memref linalg.matmul(%A, %B, %C) : memref, memref, memref %res = load %C[%c6, %c7] : memref dealloc %bC : memref dealloc %bB : memref dealloc %bA : memref return %res : f32 } // All tests return this value // CHECK: 4.2{{0+}}e+01 diff --git a/mlir/test/mlir-cpu-runner/cblas.cpp b/mlir/test/mlir-cpu-runner/mlir_test_cblas.cpp similarity index 60% rename from mlir/test/mlir-cpu-runner/cblas.cpp rename to mlir/test/mlir-cpu-runner/mlir_test_cblas.cpp index c195e0c823fb..99a6a2658422 100644 --- a/mlir/test/mlir-cpu-runner/cblas.cpp +++ b/mlir/test/mlir-cpu-runner/mlir_test_cblas.cpp @@ -1,47 +1,46 @@ -//===- cblas.cpp - Simple Blas subset implementation ----------------------===// +//===- mlir_test_cblas.cpp - Simple Blas subset implementation ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Simple Blas subset implementation. // //===----------------------------------------------------------------------===// -#include "include/cblas.h" +#include "include/mlir_test_cblas.h" #include -extern "C" float cblas_sdot(const int N, const float *X, const int incX, - const float *Y, const int incY) { +extern "C" float mlir_test_cblas_sdot(const int N, const float *X, + const int incX, const float *Y, + const int incY) { float res = 0.0f; for (int i = 0; i < N; ++i) res += X[i * incX] * Y[i * incY]; return res; } -extern "C" void cblas_sgemm(const enum CBLAS_ORDER Order, - const enum CBLAS_TRANSPOSE TransA, - const enum CBLAS_TRANSPOSE TransB, const int M, - const int N, const int K, const float alpha, - const float *A, const int lda, const float *B, - const int ldb, const float beta, float *C, - const int ldc) { +extern "C" void mlir_test_cblas_sgemm( + const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, + const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, + const float alpha, const float *A, const int lda, const float *B, + const int ldb, const float beta, float *C, const int ldc) { assert(Order == CBLAS_ORDER::CblasRowMajor); assert(TransA == CBLAS_TRANSPOSE::CblasNoTrans); assert(TransB == CBLAS_TRANSPOSE::CblasNoTrans); for (int m = 0; m < M; ++m) { auto *pA = A + m * lda; auto *pC = C + m * ldc; for (int n = 0; n < N; ++n) { float c = pC[n]; float res = 0.0f; for (int k = 0; k < K; ++k) { auto *pB = B + k * ldb; res += pA[k] * pB[n]; } pC[n] = alpha * c + beta * res; } } } diff --git a/mlir/test/mlir-cpu-runner/cblas_interface.cpp b/mlir/test/mlir-cpu-runner/mlir_test_cblas_interface.cpp similarity index 85% rename from mlir/test/mlir-cpu-runner/cblas_interface.cpp rename to mlir/test/mlir-cpu-runner/mlir_test_cblas_interface.cpp index b1fe5a6a1470..eaeeaf6cd550 100644 --- a/mlir/test/mlir-cpu-runner/cblas_interface.cpp +++ b/mlir/test/mlir-cpu-runner/mlir_test_cblas_interface.cpp @@ -1,107 +1,107 @@ -//===- cblas_interface.cpp - Simple Blas subset interface -----------------===// +//===- mlir_test_cblas_interface.cpp - Simple Blas subset interface -------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Simple Blas subset interface implementation. // //===----------------------------------------------------------------------===// -#include "include/cblas_interface.h" -#include "include/cblas.h" +#include "include/mlir_test_cblas_interface.h" +#include "include/mlir_test_cblas.h" #include #include extern "C" void _mlir_ciface_linalg_fill_viewf32_f32(StridedMemRefType *X, float f) { X->data[X->offset] = f; } extern "C" void _mlir_ciface_linalg_fill_viewsxf32_f32(StridedMemRefType *X, float f) { for (unsigned i = 0; i < X->sizes[0]; ++i) *(X->data + X->offset + i * X->strides[0]) = f; } extern "C" void _mlir_ciface_linalg_fill_viewsxsxf32_f32(StridedMemRefType *X, float f) { for (unsigned i = 0; i < X->sizes[0]; ++i) for (unsigned j = 0; j < X->sizes[1]; ++j) *(X->data + X->offset + i * X->strides[0] + j * X->strides[1]) = f; } extern "C" void _mlir_ciface_linalg_copy_viewf32_viewf32(StridedMemRefType *I, StridedMemRefType *O) { O->data[O->offset] = I->data[I->offset]; } extern "C" void _mlir_ciface_linalg_copy_viewsxf32_viewsxf32(StridedMemRefType *I, StridedMemRefType *O) { if (I->sizes[0] != O->sizes[0]) { std::cerr << "Incompatible strided memrefs\n"; printMemRefMetaData(std::cerr, *I); printMemRefMetaData(std::cerr, *O); return; } for (unsigned i = 0; i < I->sizes[0]; ++i) O->data[O->offset + i * O->strides[0]] = I->data[I->offset + i * I->strides[0]]; } extern "C" void _mlir_ciface_linalg_copy_viewsxsxf32_viewsxsxf32( StridedMemRefType *I, StridedMemRefType *O) { if (I->sizes[0] != O->sizes[0] || I->sizes[1] != O->sizes[1]) { std::cerr << "Incompatible strided memrefs\n"; printMemRefMetaData(std::cerr, *I); printMemRefMetaData(std::cerr, *O); return; } auto so0 = O->strides[0], so1 = O->strides[1]; auto si0 = I->strides[0], si1 = I->strides[1]; for (unsigned i = 0; i < I->sizes[0]; ++i) for (unsigned j = 0; j < I->sizes[1]; ++j) O->data[O->offset + i * so0 + j * so1] = I->data[I->offset + i * si0 + j * si1]; } extern "C" void _mlir_ciface_linalg_dot_viewsxf32_viewsxf32_viewf32( StridedMemRefType *X, StridedMemRefType *Y, StridedMemRefType *Z) { if (X->strides[0] != 1 || Y->strides[0] != 1 || X->sizes[0] != Y->sizes[0]) { std::cerr << "Incompatible strided memrefs\n"; printMemRefMetaData(std::cerr, *X); printMemRefMetaData(std::cerr, *Y); printMemRefMetaData(std::cerr, *Z); return; } Z->data[Z->offset] += - cblas_sdot(X->sizes[0], X->data + X->offset, X->strides[0], - Y->data + Y->offset, Y->strides[0]); + mlir_test_cblas_sdot(X->sizes[0], X->data + X->offset, X->strides[0], + Y->data + Y->offset, Y->strides[0]); } extern "C" void _mlir_ciface_linalg_matmul_viewsxsxf32_viewsxsxf32_viewsxsxf32( StridedMemRefType *A, StridedMemRefType *B, StridedMemRefType *C) { if (A->strides[1] != B->strides[1] || A->strides[1] != C->strides[1] || A->strides[1] != 1 || A->sizes[0] < A->strides[1] || B->sizes[0] < B->strides[1] || C->sizes[0] < C->strides[1] || C->sizes[0] != A->sizes[0] || C->sizes[1] != B->sizes[1] || A->sizes[1] != B->sizes[0]) { printMemRefMetaData(std::cerr, *A); printMemRefMetaData(std::cerr, *B); printMemRefMetaData(std::cerr, *C); return; } - cblas_sgemm(CBLAS_ORDER::CblasRowMajor, CBLAS_TRANSPOSE::CblasNoTrans, - CBLAS_TRANSPOSE::CblasNoTrans, C->sizes[0], C->sizes[1], - A->sizes[1], 1.0f, A->data + A->offset, A->strides[0], - B->data + B->offset, B->strides[0], 1.0f, C->data + C->offset, - C->strides[0]); + mlir_test_cblas_sgemm( + CBLAS_ORDER::CblasRowMajor, CBLAS_TRANSPOSE::CblasNoTrans, + CBLAS_TRANSPOSE::CblasNoTrans, C->sizes[0], C->sizes[1], A->sizes[1], + 1.0f, A->data + A->offset, A->strides[0], B->data + B->offset, + B->strides[0], 1.0f, C->data + C->offset, C->strides[0]); } diff --git a/mlir/test/mlir-cpu-runner/unranked_memref.mlir b/mlir/test/mlir-cpu-runner/unranked_memref.mlir index 13d4db9c90c6..aa54b56b06b7 100644 --- a/mlir/test/mlir-cpu-runner/unranked_memref.mlir +++ b/mlir/test/mlir-cpu-runner/unranked_memref.mlir @@ -1,59 +1,59 @@ -// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm -convert-std-to-llvm | mlir-cpu-runner -e main -entry-point-result=void -shared-libs=%linalg_test_lib_dir/libmlir_runner_utils%shlibext,%linalg_test_lib_dir/libcblas%shlibext,%linalg_test_lib_dir/libcblas_interface%shlibext | FileCheck %s +// RUN: mlir-opt %s -convert-linalg-to-loops -convert-linalg-to-llvm -convert-std-to-llvm | mlir-cpu-runner -e main -entry-point-result=void -shared-libs=%linalg_test_lib_dir/libmlir_runner_utils%shlibext,%linalg_test_lib_dir/libmlir_test_cblas%shlibext,%linalg_test_lib_dir/libmlir_test_cblas_interface%shlibext | FileCheck %s // CHECK: rank = 2 // CHECK: rank = 2 // CHECK-SAME: sizes = [10, 3] // CHECK-SAME: strides = [3, 1] // CHECK-COUNT-10: [10, 10, 10] // // CHECK: rank = 2 // CHECK: rank = 2 // CHECK-SAME: sizes = [10, 3] // CHECK-SAME: strides = [3, 1] // CHECK-COUNT-10: [5, 5, 5] // // CHECK: rank = 2 // CHECK: rank = 2 // CHECK-SAME: sizes = [10, 3] // CHECK-SAME: strides = [3, 1] // CHECK-COUNT-10: [2, 2, 2] // // CHECK: rank = 0 // CHECK: rank = 0 // 122 is ASCII for 'z'. // CHECK: [z] func @main() -> () { %A = alloc() : memref<10x3xf32, 0> %f2 = constant 2.00000e+00 : f32 %f5 = constant 5.00000e+00 : f32 %f10 = constant 10.00000e+00 : f32 %V = memref_cast %A : memref<10x3xf32, 0> to memref linalg.fill(%V, %f10) : memref, f32 %U = memref_cast %A : memref<10x3xf32, 0> to memref<*xf32> call @print_memref_f32(%U) : (memref<*xf32>) -> () %V2 = memref_cast %U : memref<*xf32> to memref linalg.fill(%V2, %f5) : memref, f32 %U2 = memref_cast %V2 : memref to memref<*xf32> call @print_memref_f32(%U2) : (memref<*xf32>) -> () %V3 = memref_cast %V2 : memref to memref<*xf32> %V4 = memref_cast %V3 : memref<*xf32> to memref linalg.fill(%V4, %f2) : memref, f32 %U3 = memref_cast %V2 : memref to memref<*xf32> call @print_memref_f32(%U3) : (memref<*xf32>) -> () // 122 is ASCII for 'z'. %i8_z = constant 122 : i8 %I8 = alloc() : memref store %i8_z, %I8[]: memref %U4 = memref_cast %I8 : memref to memref<*xi8> call @print_memref_i8(%U4) : (memref<*xi8>) -> () dealloc %A : memref<10x3xf32, 0> return } func @print_memref_i8(memref<*xi8>) attributes { llvm.emit_c_interface } func @print_memref_f32(memref<*xf32>) attributes { llvm.emit_c_interface }