| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | ! StarPU --- Runtime system for heterogeneous multicore architectures.!! Copyright (C) 2016-2021  Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria!! StarPU is free software; you can redistribute it and/or modify! it under the terms of the GNU Lesser General Public License as published by! the Free Software Foundation; either version 2.1 of the License, or (at! your option) any later version.!! StarPU is distributed in the hope that it will be useful, but! WITHOUT ANY WARRANTY; without even the implied warranty of! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.!! See the GNU Lesser General Public License in COPYING.LGPL for more details.!program nf_sched_ctx        use iso_c_binding       ! C interfacing module        use fstarpu_mod         ! StarPU interfacing module        use nf_sched_ctx_cl        implicit none        type(c_ptr) :: cl1   ! a pointer for a codelet structure        type(c_ptr) :: cl2   ! a pointer for another codelet structure        integer(c_int) :: err   ! return status for fstarpu_init        integer(c_int) :: ncpu  ! number of cpus workers        ! list of cpu worker ids        integer(c_int), dimension(:), allocatable :: procs        ! sub-list of cpu worker ids for sched context 1        integer(c_int) :: nprocs1        integer(c_int), dimension(:), allocatable :: procs1        integer(c_int) :: ctx1        ! sub-list of cpu worker ids for sched context 2        integer(c_int) :: nprocs2        integer(c_int), dimension(:), allocatable :: procs2        integer(c_int) :: ctx2        ! needed to be able to call c_loc on it, to get a ptr to the string        character(kind=c_char,len=6), target :: ctx2_policy = C_CHAR_"eager"//C_NULL_CHAR        integer(c_int),parameter :: n = 20        integer(c_int) :: i        integer(c_int), target :: arg_id        integer(c_int), target :: arg_ctx        ! initialize StarPU with default settings        err = fstarpu_init(C_NULL_PTR)        if (err == -19) then                stop 77        end if        ! stop there if no CPU worker available        ncpu = fstarpu_cpu_worker_get_count()        if (ncpu == 0) then                call fstarpu_shutdown()                stop 77        end if        ! actually we really need at least 2 CPU workers such to allocate 2 non overlapping contexts        if (ncpu < 2) then                call fstarpu_shutdown()                stop 77        end if        ! allocate and fill codelet structs        cl1 = fstarpu_codelet_allocate()        call fstarpu_codelet_set_name(cl1, C_CHAR_"sched_ctx_cl1"//C_NULL_CHAR)        call fstarpu_codelet_add_cpu_func(cl1, C_FUNLOC(cl_cpu_func_sched_ctx))        ! allocate and fill codelet structs        cl2 = fstarpu_codelet_allocate()        call fstarpu_codelet_set_name(cl2, C_CHAR_"sched_ctx_cl2"//C_NULL_CHAR)        call fstarpu_codelet_add_cpu_func(cl2, C_FUNLOC(cl_cpu_func_sched_ctx))        ! get the list of CPU worker ids        allocate(procs(ncpu))        err = fstarpu_worker_get_ids_by_type(FSTARPU_CPU_WORKER, procs, ncpu)        ! split the workers in two sets        nprocs1 = ncpu/2;        allocate(procs1(nprocs1))        write(*,*) "procs1:"        do i=1,nprocs1                procs1(i) = procs(i)                write(*,*) i, procs1(i)        end do        nprocs2 = ncpu - nprocs1        allocate(procs2(nprocs2))        write(*,*) "procs2:"        do i=1,nprocs2                procs2(i) = procs(nprocs1+i)                write(*,*) i, procs2(i)        end do        deallocate(procs)        ! create sched context 1 with default policy, by giving a NULL policy name        ctx1 = fstarpu_sched_ctx_create(procs1, nprocs1,  &            C_CHAR_"ctx1"//C_NULL_CHAR, &            (/ FSTARPU_SCHED_CTX_POLICY_NAME, c_null_ptr, c_null_ptr /) &            )        ! create sched context 2 with a user selected policy name        ctx2 = fstarpu_sched_ctx_create(procs2, nprocs2,  &            C_CHAR_"ctx2"//C_NULL_CHAR, &            (/ FSTARPU_SCHED_CTX_POLICY_NAME, c_loc(ctx2_policy), c_null_ptr /))        ! set inheritor context         call fstarpu_sched_ctx_set_inheritor(ctx2, ctx1);        call fstarpu_sched_ctx_display_workers(ctx1)        call fstarpu_sched_ctx_display_workers(ctx2)        do i = 1, n                ! submit a task on context 1                arg_id = 1*1000 + i                arg_ctx = ctx1                call fstarpu_insert_task((/ cl1, &                        FSTARPU_VALUE, c_loc(arg_id), FSTARPU_SZ_C_INT, &                        FSTARPU_SCHED_CTX, c_loc(arg_ctx), &                    C_NULL_PTR /))        end do        do i = 1, n                ! now submit a task on context 2                arg_id = 2*1000 + i                arg_ctx = ctx2                call fstarpu_insert_task((/ cl2, &                        FSTARPU_VALUE, c_loc(arg_id), FSTARPU_SZ_C_INT, &                        FSTARPU_SCHED_CTX, c_loc(arg_ctx), &                    C_NULL_PTR /))        end do        ! mark submission process as completed on context 2        call fstarpu_sched_ctx_finished_submit(ctx2)        do i = 1, n                ! now submit a task on context 1 again                arg_id = 1*10000 + i                arg_ctx = ctx1                call fstarpu_insert_task((/ cl1, &                        FSTARPU_VALUE, c_loc(arg_id), FSTARPU_SZ_C_INT, &                        FSTARPU_SCHED_CTX, c_loc(arg_ctx), &                    C_NULL_PTR /))        end do        ! mark submission process as completed on context 1        call fstarpu_sched_ctx_finished_submit(ctx1)        ! wait for completion of all tasks        call fstarpu_task_wait_for_all()        ! show how to add some workers from a context to another        call fstarpu_sched_ctx_add_workers(procs1, nprocs1, ctx2)        ! deallocate both contexts        call fstarpu_sched_ctx_delete(ctx2)        call fstarpu_sched_ctx_delete(ctx1)        deallocate(procs2)        deallocate(procs1)        ! free codelet structure        call fstarpu_codelet_free(cl1)        call fstarpu_codelet_free(cl2)        ! shut StarPU down        call fstarpu_shutdown()end program nf_sched_ctx
 |