CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
328 lines
18 KiB
MLIR
328 lines
18 KiB
MLIR
// RUN: mlir-opt -split-input-file -convert-to-llvm %s | FileCheck %s
|
|
|
|
// COM: Test MPICH ABI
|
|
// CHECK-LABEL: module attributes {dlti.map = #dlti.map<"MPI:Implementation" = "MPICH">} {
|
|
// CHECK-DAG: llvm.func @MPI_Finalize() -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Reduce_scatter_block(!llvm.ptr, !llvm.ptr, i32, i32, i32, i32) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Allreduce(!llvm.ptr, !llvm.ptr, i32, i32, i32, i32) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Comm_size(i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Allgather(!llvm.ptr, i32, i32, !llvm.ptr, i32, i32, i32) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Comm_split(i32, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Recv(!llvm.ptr, i32, i32, i32, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Send(!llvm.ptr, i32, i32, i32, i32, i32) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Comm_rank(i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Init(!llvm.ptr, !llvm.ptr) -> i32
|
|
module attributes {dlti.map = #dlti.map<"MPI:Implementation" = "MPICH">} {
|
|
|
|
// CHECK-LABEL: llvm.func @test_init_finalize_mpich
|
|
func.func @test_init_finalize_mpich() {
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.zero : !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Init([[v0]], [[v0]]) : (!llvm.ptr, !llvm.ptr) -> i32
|
|
%0 = mpi.init : !mpi.retval
|
|
// CHECK: llvm.call @MPI_Finalize() : () -> i32
|
|
%1 = mpi.finalize : !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_comm_rank_mpich
|
|
func.func @test_comm_rank_mpich() {
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v1:%.*]] = llvm.trunc [[v0]] : i64 to i32
|
|
// CHECK: [[v2:%.*]] = llvm.mlir.constant(1 : i32) : i32
|
|
// CHECK: [[v3:%.*]] = llvm.alloca [[v2]] x i32 : (i32) -> !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Comm_rank([[v1]], [[v3]]) : (i32, !llvm.ptr) -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_send_mpich
|
|
func.func @test_send_mpich(%arg0: memref<100xf32>) {
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: llvm.call @MPI_Comm_rank
|
|
// CHECK: [[v2:%.*]] = llvm.load {{.*}} : !llvm.ptr -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
// COM: Test send without retval
|
|
// CHECK: [[v3:%.*]] = llvm.extractvalue [[v0]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v4:%.*]] = llvm.extractvalue [[v0]][2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v5:%.*]] = llvm.getelementptr [[v3]][[[v4]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v6:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v7:%.*]] = llvm.trunc [[v6]] : i64 to i32
|
|
// CHECK: [[v8:%.*]] = llvm.mul [[v7]]
|
|
// CHECK: [[v9:%.*]] = llvm.mlir.constant(1275069450 : i32) : i32
|
|
// CHECK: [[v10:%.*]] = llvm.trunc [[v1]] : i64 to i32
|
|
// CHECK: = llvm.call @MPI_Send([[v5]], [[v8]], [[v9]], [[v2]], [[v2]], [[v10]]) : (!llvm.ptr, i32, i32, i32, i32, i32) -> i32
|
|
mpi.send(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32
|
|
// COM: Test send with retval
|
|
// CHECK: = llvm.call @MPI_Send({{.*}}) : (!llvm.ptr, i32, i32, i32, i32, i32) -> i32
|
|
%1 = mpi.send(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32 -> !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_recv_mpich
|
|
func.func @test_recv_mpich(%arg0: memref<100xf32>) {
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: llvm.call @MPI_Comm_rank
|
|
// CHECK: [[v2:%.*]] = llvm.load {{.*}} : !llvm.ptr -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
// COM: Test recv without retval
|
|
// CHECK: [[v3:%.*]] = llvm.extractvalue [[v0]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v4:%.*]] = llvm.extractvalue [[v0]][2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v5:%.*]] = llvm.getelementptr [[v3]][[[v4]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v6:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v7:%.*]] = llvm.trunc [[v6]] : i64 to i32
|
|
// CHECK: [[v8:%.*]] = llvm.mul [[v7]]
|
|
// CHECK: [[v9:%.*]] = llvm.mlir.constant(1275069450 : i32) : i32
|
|
// CHECK: [[v10:%.*]] = llvm.trunc [[v1]] : i64 to i32
|
|
// CHECK: [[v11:%.*]] = llvm.mlir.constant(1 : i64) : i64
|
|
// CHECK: [[v12:%.*]] = llvm.inttoptr [[v11]] : i64 to !llvm.ptr
|
|
// CHECK: = llvm.call @MPI_Recv([[v5]], [[v8]], [[v9]], [[v2]], [[v2]], [[v10]], [[v12]]) : (!llvm.ptr, i32, i32, i32, i32, i32, !llvm.ptr) -> i32
|
|
mpi.recv(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32
|
|
// COM: Test recv with retval
|
|
// CHECK: = llvm.call @MPI_Recv({{.*}}) : (!llvm.ptr, i32, i32, i32, i32, i32, !llvm.ptr) -> i32
|
|
%2 = mpi.recv(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32 -> !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_comm_split_mpich
|
|
func.func @test_comm_split_mpich() {
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(10 : i32) : i32
|
|
%color = arith.constant 10 : i32
|
|
// CHECK: [[v2:%.*]] = llvm.mlir.constant(22 : i32) : i32
|
|
%key = arith.constant 22 : i32
|
|
// CHECK: [[v3:%.*]] = llvm.trunc [[v0]] : i64 to i32
|
|
// CHECK: [[v4:%.*]] = llvm.mlir.constant(1 : i32) : i32
|
|
// CHECK: [[v5:%.*]] = llvm.alloca [[v4]] x i32 : (i32) -> !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Comm_split([[v3]], [[v1]], [[v2]], [[v5]]) : (i32, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK: llvm.load [[v5]] : !llvm.ptr -> i32
|
|
%split = mpi.comm_split(%comm, %color, %key) : !mpi.comm
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_allgather_mpich
|
|
func.func @test_allgather_mpich(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: llvm.call @MPI_Comm_size
|
|
// CHECK: llvm.call @MPI_Allgather({{.*}}) : (!llvm.ptr, i32, i32, !llvm.ptr, i32, i32, i32) -> i32
|
|
%err = mpi.allgather(%arg0, %arg0, %comm) : memref<100xf32>, memref<100xf32> -> !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_allreduce_mpich
|
|
func.func @test_allreduce_mpich(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
// CHECK: [[v2:%.*]] = llvm.getelementptr {{.*}} : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v3:%.*]] = llvm.mul
|
|
// CHECK: [[v4:%.*]] = llvm.getelementptr {{.*}} : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v5:%.*]] = llvm.mlir.constant(-1 : i64) : i64
|
|
// CHECK: [[v6:%.*]] = llvm.inttoptr [[v5]] : i64 to !llvm.ptr
|
|
// CHECK: [[v7:%.*]] = llvm.mlir.constant(1275069450 : i32) : i32
|
|
// CHECK: [[v8:%.*]] = llvm.mlir.constant(1476395011 : i32) : i32
|
|
// CHECK: [[v9:%.*]] = llvm.trunc [[v1]] : i64 to i32
|
|
// CHECK: llvm.call @MPI_Allreduce([[v6]], [[v4]], [[v3]], [[v7]], [[v8]], [[v9]]) : (!llvm.ptr, !llvm.ptr, i32, i32, i32, i32) -> i32
|
|
mpi.allreduce(%arg0, %arg0, MPI_SUM, %comm) : memref<100xf32>, memref<100xf32>
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_reduce_scatter_block_mpich
|
|
func.func @test_reduce_scatter_block_mpich(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: llvm.mul
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(1 : index) : i32
|
|
// CHECK: [[v2:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v3:%.*]] = llvm.trunc [[v2]] : i64 to i32
|
|
// CHECK: [[v4:%.*]] = llvm.mul [[v3]], [[v1]] : i32
|
|
// CHECK: [[v5:%.*]] = llvm.inttoptr {{.*}} : i64 to !llvm.ptr
|
|
// CHECK: llvm.cond_br {{.*}}, ^[[bb1:.*]], ^{{.*}}
|
|
// CHECK: ^[[bb1]]:
|
|
// CHECK: llvm.call @MPI_Reduce_scatter_block([[v5]], {{.*}}, [[v4]], {{.*}}) : (!llvm.ptr, !llvm.ptr, i32, i32, i32, i32) -> i32
|
|
mpi.reduce_scatter_block(%arg0, %arg0, MPI_SUM, %comm) : memref<100xf32>, memref<100xf32>
|
|
return
|
|
}
|
|
}
|
|
|
|
// -----
|
|
|
|
// COM: Test OpenMPI ABI
|
|
// CHECK-LABEL: module attributes {dlti.map = #dlti.map<"MPI:Implementation" = "OpenMPI">} {
|
|
// CHECK-DAG: llvm.func @MPI_Finalize() -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Comm_split(!llvm.ptr, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Reduce_scatter_block(!llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Allreduce(!llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.mlir.global external @ompi_mpi_sum() {addr_space = 0 : i32} : !llvm.struct<"ompi_predefined_op_t", opaque>
|
|
// CHECK-DAG: llvm.func @MPI_Comm_size(!llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Allgather(!llvm.ptr, i32, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Recv(!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.func @MPI_Send(!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.mlir.global external @ompi_mpi_float() {addr_space = 0 : i32} : !llvm.struct<"ompi_predefined_datatype_t", opaque>
|
|
// CHECK-DAG: llvm.func @MPI_Comm_rank(!llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK-DAG: llvm.mlir.global external @ompi_mpi_comm_world() {addr_space = 0 : i32} : !llvm.struct<"ompi_communicator_t", opaque>
|
|
// CHECK-DAG: llvm.func @MPI_Init(!llvm.ptr, !llvm.ptr) -> i32
|
|
module attributes { dlti.map = #dlti.map<"MPI:Implementation" = "OpenMPI"> } {
|
|
|
|
// CHECK-LABEL: llvm.func @test_init_finalize_openmpi
|
|
func.func @test_init_finalize_openmpi() {
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.zero : !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Init([[v0]], [[v0]]) : (!llvm.ptr, !llvm.ptr) -> i32
|
|
%0 = mpi.init : !mpi.retval
|
|
// CHECK: llvm.call @MPI_Finalize() : () -> i32
|
|
%1 = mpi.finalize : !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_comm_rank_openmpi
|
|
func.func @test_comm_rank_openmpi() {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.addressof @ompi_mpi_comm_world : !llvm.ptr
|
|
// CHECK: [[v1:%.*]] = llvm.ptrtoint [[v0]] : !llvm.ptr to i64
|
|
// CHECK: [[v2:%.*]] = llvm.inttoptr [[v1]] : i64 to !llvm.ptr
|
|
// CHECK: [[v3:%.*]] = llvm.mlir.constant(1 : i32) : i32
|
|
// CHECK: [[v4:%.*]] = llvm.alloca [[v3]] x i32 : (i32) -> !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Comm_rank([[v2]], [[v4]]) : (!llvm.ptr, !llvm.ptr) -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_send_openmpi
|
|
func.func @test_send_openmpi(%arg0: memref<100xf32>) {
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.addressof @ompi_mpi_comm_world : !llvm.ptr
|
|
// CHECK: [[v2:%.*]] = llvm.ptrtoint [[v1]] : !llvm.ptr to i64
|
|
// CHECK: llvm.call @MPI_Comm_rank
|
|
// CHECK: [[v3:%.*]] = llvm.load {{.*}} : !llvm.ptr -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
// COM: Test send without retval
|
|
// CHECK: [[v4:%.*]] = llvm.extractvalue [[v0]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v5:%.*]] = llvm.extractvalue [[v0]][2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v6:%.*]] = llvm.getelementptr [[v4]][[[v5]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v7:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v8:%.*]] = llvm.trunc [[v7]] : i64 to i32
|
|
// CHECK: [[v9:%.*]] = llvm.mul [[v8]]
|
|
// CHECK: [[v10:%.*]] = llvm.mlir.addressof @ompi_mpi_float : !llvm.ptr
|
|
// CHECK: [[v11:%.*]] = llvm.inttoptr [[v2]] : i64 to !llvm.ptr
|
|
// CHECK: = llvm.call @MPI_Send([[v6]], [[v9]], [[v10]], [[v3]], [[v3]], [[v11]]) : (!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr) -> i32
|
|
mpi.send(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32
|
|
// COM: Test send with retval
|
|
// CHECK: = llvm.call @MPI_Send({{.*}}) : (!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr) -> i32
|
|
%1 = mpi.send(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32 -> !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_recv_openmpi
|
|
func.func @test_recv_openmpi(%arg0: memref<100xf32>) {
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.addressof @ompi_mpi_comm_world : !llvm.ptr
|
|
// CHECK: [[v2:%.*]] = llvm.ptrtoint [[v1]] : !llvm.ptr to i64
|
|
// CHECK: llvm.call @MPI_Comm_rank
|
|
// CHECK: [[v3:%.*]] = llvm.load {{.*}} : !llvm.ptr -> i32
|
|
%retval, %rank = mpi.comm_rank(%comm) : !mpi.retval, i32
|
|
// COM: Test recv without retval
|
|
// CHECK: [[v4:%.*]] = llvm.extractvalue [[v0]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v5:%.*]] = llvm.extractvalue [[v0]][2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v6:%.*]] = llvm.getelementptr [[v4]][[[v5]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v7:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v8:%.*]] = llvm.trunc [[v7]] : i64 to i32
|
|
// CHECK: [[v9:%.*]] = llvm.mul [[v8]]
|
|
// CHECK: [[v10:%.*]] = llvm.mlir.addressof @ompi_mpi_float : !llvm.ptr
|
|
// CHECK: [[v11:%.*]] = llvm.inttoptr [[v2]] : i64 to !llvm.ptr
|
|
// CHECK: [[v12:%.*]] = llvm.mlir.constant(0 : i64) : i64
|
|
// CHECK: [[v13:%.*]] = llvm.inttoptr [[v12]] : i64 to !llvm.ptr
|
|
// CHECK: = llvm.call @MPI_Recv([[v6]], [[v9]], [[v10]], [[v3]], [[v3]], [[v11]], [[v13]]) : (!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr, !llvm.ptr) -> i32
|
|
mpi.recv(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32
|
|
// COM: Test recv with retval
|
|
// CHECK: = llvm.call @MPI_Recv({{.*}}) : (!llvm.ptr, i32, !llvm.ptr, i32, i32, !llvm.ptr, !llvm.ptr) -> i32
|
|
%2 = mpi.recv(%arg0, %rank, %rank, %comm) : memref<100xf32>, i32, i32 -> !mpi.retval
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_comm_split_openmpi
|
|
func.func @test_comm_split_openmpi() {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.addressof @ompi_mpi_comm_world : !llvm.ptr
|
|
// CHECK: [[v1:%.*]] = llvm.ptrtoint [[v0]] : !llvm.ptr to i64
|
|
// CHECK: [[v2:%.*]] = llvm.mlir.constant(10 : i32) : i32
|
|
%color = arith.constant 10 : i32
|
|
// CHECK: [[v3:%.*]] = llvm.mlir.constant(22 : i32) : i32
|
|
%key = arith.constant 22 : i32
|
|
// CHECK: [[v4:%.*]] = llvm.inttoptr [[v1]] : i64 to !llvm.ptr
|
|
// CHECK: [[v5:%.*]] = llvm.mlir.constant(1 : i32) : i32
|
|
// CHECK: [[v6:%.*]] = llvm.alloca [[v5]] x !llvm.ptr : (i32) -> !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Comm_split([[v4]], [[v2]], [[v3]], [[v6]]) : (!llvm.ptr, i32, i32, !llvm.ptr) -> i32
|
|
// CHECK: llvm.load [[v6]] : !llvm.ptr -> i32
|
|
%split = mpi.comm_split(%comm, %color, %key) : !mpi.comm
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_allgather_openmpi
|
|
func.func @test_allgather_openmpi(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: llvm.call @MPI_Comm_size({{.*}}) : (!llvm.ptr, !llvm.ptr) -> i32
|
|
// CHECK: llvm.udiv {{.*}} : i32
|
|
// CHECK: llvm.call @MPI_Allgather({{.*}}) : (!llvm.ptr, i32, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr) -> i32
|
|
mpi.allgather(%arg0, %arg0, %comm) : memref<100xf32>, memref<100xf32>
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_allreduce_openmpi
|
|
func.func @test_allreduce_openmpi(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.addressof @ompi_mpi_comm_world : !llvm.ptr
|
|
// CHECK: [[v2:%.*]] = llvm.ptrtoint [[v1]] : !llvm.ptr to i64
|
|
// CHECK: [[v3:%.*]] = llvm.getelementptr {{.*}} : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v4:%.*]] = llvm.mul
|
|
// CHECK: [[v5:%.*]] = llvm.getelementptr {{.*}} : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
|
// CHECK: [[v6:%.*]] = llvm.mlir.constant(1 : i64) : i64
|
|
// CHECK: [[v7:%.*]] = llvm.inttoptr [[v6]] : i64 to !llvm.ptr
|
|
// CHECK: [[v8:%.*]] = llvm.mlir.addressof @ompi_mpi_float : !llvm.ptr
|
|
// CHECK: [[v9:%.*]] = llvm.mlir.addressof @ompi_mpi_sum : !llvm.ptr
|
|
// CHECK: [[v10:%.*]] = llvm.inttoptr [[v2]] : i64 to !llvm.ptr
|
|
// CHECK: llvm.call @MPI_Allreduce([[v7]], [[v5]], [[v4]], [[v8]], [[v9]], [[v10]]) : (!llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr, !llvm.ptr) -> i32
|
|
mpi.allreduce(%arg0, %arg0, MPI_SUM, %comm) : memref<100xf32>, memref<100xf32>
|
|
return
|
|
}
|
|
|
|
// CHECK-LABEL: llvm.func @test_reduce_scatter_block_openmpi
|
|
func.func @test_reduce_scatter_block_openmpi(%arg0: memref<100xf32>) {
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
// CHECK: [[v0:%.*]] = llvm.insertvalue {{.*}}[4, 0]
|
|
// CHECK: llvm.mul
|
|
// CHECK: [[v1:%.*]] = llvm.mlir.constant(1 : index) : i32
|
|
// CHECK: [[v2:%.*]] = llvm.extractvalue [[v0]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
|
// CHECK: [[v3:%.*]] = llvm.trunc [[v2]] : i64 to i32
|
|
// CHECK: [[v4:%.*]] = llvm.mul [[v3]], [[v1]] : i32
|
|
// CHECK: [[v5:%.*]] = llvm.inttoptr {{.*}} : i64 to !llvm.ptr
|
|
// CHECK: llvm.cond_br {{.*}}, ^[[bb1:.*]], ^{{.*}}
|
|
// CHECK: ^[[bb1]]:
|
|
// CHECK: llvm.call @MPI_Reduce_scatter_block([[v5]], {{.*}}, [[v4]], {{.*}}) : (!llvm.ptr, !llvm.ptr, i32, !llvm.ptr, !llvm.ptr, !llvm.ptr) -> i32
|
|
mpi.reduce_scatter_block(%arg0, %arg0, MPI_SUM, %comm) : memref<100xf32>, memref<100xf32>
|
|
return
|
|
}
|
|
}
|
|
|
|
// -----
|
|
|
|
module attributes {mpi.dlti = #dlti.map<"MPI:Implementation" = "MPICH", "MPI:comm_world_size" = 4, "MPI:comm_world_rank" = 1> } {
|
|
// CHECK-LABEL: llvm.func @test_fold
|
|
func.func @test_fold(%arg0: memref<100xf32>) {
|
|
// CHECK: [[v0:%.*]] = llvm.mlir.constant(1140850688 : i64) : i64
|
|
%comm = mpi.comm_world : !mpi.comm
|
|
|
|
// CHECK-NOT: llvm.call @MPI_Comm_size
|
|
// CHECK: llvm.call @MPI_Allgather({{.*}}) : (!llvm.ptr, i32, i32, !llvm.ptr, i32, i32, i32) -> i32
|
|
%err3 = mpi.allgather(%arg0, %arg0, %comm) : memref<100xf32>, memref<100xf32> -> !mpi.retval
|
|
return
|
|
}
|
|
}
|