test16.c

来自「shpf 1.9一个并行编译器」· C语言 代码 · 共 208 行

C
208
字号


//  !hpf$ processors p(3, 2)
//
//  !hpf$ template t(30, 30)
//  !hpf$ distribute t(block, cyclic(10)) onto p
//
//  integer a(6, 6)
//  !hpf$ align a(i, j) with t(3 + 3 * i, 5 * j)
//
//  integer b(6)
//  !hpf$ align b(j) with t(j, *)
//
//  integer s(6)
//  !hpf$ align s(j) with t(3, 23 + j)
//
//  integer i, j
//
//  do i = 1, 6
//    do j = 1, 6
//      a(i, j) = 10 * i + j
//    enddo
//  enddo
//
//  print *, 'a...'
//  do i = 1, 6
//    print "(10i4)", a(i, : )
//  enddo
//
//  a = eoshift(a, 2, -1, 1)
//  
//  print *, 'eoshift...'
//
//  do i = 1, 6
//    print "(10i4)", a(i, : )
//  enddo
//
//  do j = 1, 6
//    b(j) = -j
//  enddo
//
//  a = eoshift(a, -2, b, 1)
//  
//  print *, 'eoshift...'
//
//  do i = 1, 6
//    print "(10i4)", a(i, : )
//  enddo
//
//  do j = 1, 6
//    s(j) = 2 - (j - 1) / 2
//  enddo
//
//  a = eoshift(a, s, -1, 2)
//
//  print *, 'eoshift...'
//
//  do i = 1, 6
//    print "(10i4)", a(i, : )
//  enddo
//
//  a = eoshift(a, -s, b, 2)
//
//  print *, 'eoshift...'
//
//  do i = 1, 6
//    print "(10i4)", a(i, : )
//  enddo
//
//end


#include <stdio.h>
#include "ad++.h"
#include "admacros.h"


void main(int argc, char* argv[]) {
  AdlibInit(argc, argv) ;

  Procs2 p(3, 2) ;

  Range t1(30, p.dim(0), BLK) ;
  Range t2(30, p.dim(1), CYC, 10) ;

  Range a1 = t1.subrng(6, 5, 3) ;
  Range a2 = t2.subrng(6, 4, 5) ;
  Array2<int> a(p, a1, a2) ;

  Range b1 = t1.subrng(6, 0) ;
  Array1<int> b(p, b1) ;

  Range s1 = t2.subrng(6, 23) ;
  Array1<int> s(p / t1(2), s1) ;

  Array2<int> tmp1(p, a1, a2) ;
  Array1<int> tmp2(p, a2) ;
  Array1<int> tmp3(p, a1) ;
  Array1<int> tmp4(p, a1) ;

//  do i = 1, 6
//    do j = 1, 6
//      a(i, j) = 10 * i + j
//    enddo
//  enddo

  on(p) {
    where(a1) {
      where(a2) {
	a(a1, a2) = 10 * (a1 + 1) + a2 + 1 ;
      } erewh(a2) ;
    } erewh(a1) ;
  } no(p) ;

  gprintf("a...\n") ;
  aprintf("%4d%*N", a, a2.size()) ;

//  a = eoshift(a, 2, -1, 1)

  on(p) {
    where(a1) {
      where(a2) {
	tmp1(a1, a2) = -1 ;
      } erewh(a2) ;
    } erewh(a1) ;
  } no(p) ;
  shift(tmp1, a, 2, 0, EDGE) ;
  copy(a, tmp1) ;

  gprintf("eoshift...\n") ;
  aprintf("%4d%*N", a, a2.size()) ;

//  do j = 1, 6
//    b(j) = -j
//  enddo

  on(p) {
    where(b1) {
      b(b1) = -(b1 + 1) ;
    } erewh(b1) ;
  } no(p) ;

//  a = eoshift(a, -2, b, 1)

  remap(tmp2, b) ;
  on(p) {
    where(a1) {
      where(a2) {
	tmp1(a1, a2) = tmp2(a2) ;
      } erewh(a2) ;
    } erewh(a1) ;
  } no(p) ;
  shift(tmp1, a, -2, 0, EDGE) ;
  copy(a, tmp1) ;

  gprintf("eoshift...\n") ;
  aprintf("%4d%*N", a, a2.size()) ;

//  do j = 1, 6
//    s(j) = 2 - (j - 1) / 2
//  enddo

  Group q = s.grp() ;
  on(q) {
    where(s1) {
      s(s1) = 2 - s1 / 2 ;
    } erewh(s1) ;
  } no(q) ;

//  a = eoshift(a, s, -1, 2)

  remap(tmp3, s) ;

  on(p) {
    where(a1) {
      where(a2) {
	tmp1(a1, a2) = -1 ;
      } erewh(a2) ;
    } erewh(a1) ;
  } no(p) ;
  skew(tmp1, a, tmp3, 1, EDGE) ;
  copy(a, tmp1) ;

  gprintf("eoshift...\n") ;
  aprintf("%4d%*N", a, a2.size()) ;

//  a = eoshift(a, -s, b, 2)

  remap(tmp4, b) ;
  on(p) {
    where(a1) {
      tmp3(a1) = -tmp3(a1) ;
      where(a2) {
	tmp1(a1, a2) = tmp4(a1) ;
      } erewh(a2) ;
    } erewh(a1) ;
  } no(p) ;
  skew(tmp1, a, tmp3, 1, EDGE) ;
  copy(a, tmp1) ;

  gprintf("eoshift...\n") ;
  aprintf("%4d%*N", a, a2.size()) ;

  AdlibFinalize() ;
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?