IBM Books

Administration Guide


putv.f (Fortran)

This Fortran program is an example of transferring noncontiguous data using the LAPI vector transfer function:

/* lapi_fbinding_1 */
/* Example Program showing use of the LAPI vector transfer function. */
 
        implicit none
        include 'lapif.h'
        integer i
        integer eh_addr, hndl
        integer ierr, val, value
        integer ocntr,tcntr,ccntr,curcntrval
        integer addr_oc, addr_tc, addr_cc
        integer org_vec(4)
        integer tgt_vec(4)
        integer tgt_vec_addr
        integer tgt_vec_array(0:1023)
        integer recv_buf(1000000)
        integer send_buf(1000000)
        integer blk_size, stride, num_vecs
        integer tgt
        integer tgt_info_array(1024)
        integer org_info_array(1024)
        integer info(10)
        integer error_handler
        integer taskid,numtasks,maxuhdrsz,maxdatasz,maxpktsz
        character err_msg_buf(160)
 
        call LAPI_Init(hndl, info, ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Init Error message: ',err_msg_buf
         STOP 1
        else
         write(6,*) 'LAPI_Init SUCCESSFUL     '
        endif
 
        call LAPI_Address(tgt_vec, tgt_vec_addr , ierr)
        call LAPI_Address_init(hndl, tgt_vec_addr, tgt_vec_array, ierr)
 
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Address_init Error message: ',err_msg_buf
         STOP 1
        else
         write(6,*) 'LAPI_Address_init SUCCESSFUL     '
        endif
 
        call LAPI_Qenv(hndl,TASK_ID,taskid,ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Qenv Error message: ',err_msg_buf
         STOP 1
        endif
        call LAPI_Qenv(hndl,NUM_TASKS,numtasks,ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Qenv Error message: ',err_msg_buf
         STOP 1
        endif
        call LAPI_Qenv(hndl,MAX_UHDR_SZ,maxuhdrsz,ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Qenv Error message: ',err_msg_buf
         STOP 1
        endif
        call LAPI_Qenv(hndl,MAX_DATA_SZ,maxdatasz,ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Qenv Error message: ',err_msg_buf
         STOP 1
        endif
        call LAPI_Qenv(hndl,MAX_PKT_SZ,maxpktsz,ierr)
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Qenv Error message: ',err_msg_buf
         STOP 1
        endif
        write(6,*) 'numtasks = ',numtasks,' taskid = ',taskid,
     x    ' max_pkt_sz = ',maxpktsz,' max_uhdr_sz = ',maxuhdrsz,
     x    ' max_data_sz = ',maxdatasz
        blk_size = 1024
        num_vecs = 4
        stride   = 2000
        org_vec(1) = LAPI_GEN_STRIDED_XFER
        tgt_vec(1) = LAPI_GEN_STRIDED_XFER
        org_vec(2) = num_vecs
        tgt_vec(2) = num_vecs
        call LAPI_Address(org_info_array, org_vec(3), ierr)
        call LAPI_Address(tgt_info_array, tgt_vec(3), ierr)
        call LAPI_Address(send_buf, org_info_array(1), ierr)
        call LAPI_Address(recv_buf, tgt_info_array(1), ierr)
        org_info_array(2) = blk_size
        tgt_info_array(2) = blk_size
        org_info_array(3) = stride
        tgt_info_array(3) = stride
C
        tgt = mod((taskid + 1),numtasks)
 
 
        call LAPI_Gfence(hndl,ierr)
        write(6,*) 'After 1st Gfence...'
 
        write(6,*) "Issuing Putv..."
        call LAPI_Putv(hndl,tgt,tgt_vec_array(tgt),org_vec,
     x      LAPI_ADDR_NULL,LAPI_ADDR_NULL,LAPI_ADDR_NULL,ierr)
 
        write(6,*) "Done issuing Putv..."
 
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Putv Error message: ',err_msg_buf
        else
         write(6,*) 'LAPI_Putv SUCCESSFUL.....'
        endif
 
        write(6,*) 'Issuing LAPI_Gfence........'
        call LAPI_Gfence(hndl,ierr)
        write(6,*) 'Done issuing LAPI_Gfence........'
c
        write(6,*) 'Issuing LAPI_Term........'
        call LAPI_Term(hndl, ierr)
        write(6,*) 'Done issuing LAPI_Term........'
        if (ierr .ne. LAPI_SUCCESS) then
         val = ierr
         call LAPI_Msg_string(val,err_msg_buf,ierr)
         write(6,*) 'LAPI_Term Error message: ',err_msg_buf
         STOP 1
        else
         write(6,*) 'LAPI_Term SUCCESSFUL     '
        endif
c
        end
c
        subroutine error_handler(hndl,error_code,err_type,taskid,src)
        include "lapif.h"
        integer buf(40), ierr, error_code
        character carray(160)
        write(6,*) 'Error Handler: CODE = ',error_code,'error type = ',
     x   err_type,'taskid = ',taskid,' src = ',src
        call LAPI_Msg_string(error_code, carray, ierr)
        write(6,*) "Error message = ",carray
        return
        end


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]