20150325

1. 영어 기사 읽기
1) Malaria Parasite Attracts Mosquitoes with Perfume, Scientific American
– It does so using a chloroplast-like organelle, like the one plants use to capture sunlight. (organelle – 세포 기관)
2) Mars One: ‘We’re all going to die, but it’s important what you do before you die’, CNN


2. 여러 프로그램의 실행 시점 맞추기
총 세 가지 언어를 사용해 프로그램간의 실행 시점을 맞춰야 한다. (Python, C, Fortran)
Python을 사용해 semaphore 변수를 초기화하고, C 또는 Fortran으로 작성된 프로그램이 sync되도록 한다. 그리고 모든 프로그램이 특정 지점에 도달하면 Python 스크립트가 체크포인트를 생성하도록 해야 한다.

C를 사용한 여러 워크로드간의 실행 시점 맞추기는 Avadh patel의 블로그에서 확인할 수 있다[1]. 아래는 관련 코드이다.

1) set_semaphore.cpp : 세마포어 변수를 생성해, 프로그램의 실행 지점 맞는지 확인 후 체크포인트 생성
2) sem_helper.h : set_semaphore.cpp에서 사용하는 세마포어 관련 함수 제공
3) sync_all_processes.h : 실행 지점을 맞추고자 하는 프로그램에서 호출하면 됨.

set_semaphore.cpp

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
 
#include "sem_helper.h"
#include "ptlcalls.h"
 
using namespace std;
 
int main (int argc, char** argv)
{
    int sem_id;
    int sem_val;
    int rc;
 
    if (argc < 2) {
        cout << "Please specify the initial semaphore value.\n";
        return 1;
    }
 
    /* Get semaphore */
    sem_id = get_semaphore();
 
    /* Retrive semaphore value from command line arg */
    sem_val = atoi(argv[1]);
 
    /* Set semaphore value */
    rc = set_semaphore(sem_id, sem_val);
    if (rc == -1) {
        perror("set_semaphore: semctl");
        return 1;
    }
 
    /* Now wait for semaphore to reach to 0 */
    wait_semaphore (sem_id);
 
    /* All threads will be in ROI so either create a checkpoint or
     * switch to simulation mode. */
    ptlcall_checkpoint_and_shutdown("checkpoint_1");
 
    return 0;
}

sem_helper.h

/* This file provides basic function to synchronize multiple processes using
 * System V Semaphores.  It uses semaphore id 786 so please make sure none of
 * your benchmarks uses that ID. */
 
#ifndef SEM_HELPER_H
#define SEM_HELPER_H
 
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
 
static int SEM_ID = 678;
 
int get_semaphore ()
{
    int sem_id;
 
    sem_id = semget(SEM_ID, 1, IPC_CREAT | 0666);
 
    if (sem_id == -1) {
        perror("get_semaphore: semget");
        exit(1);
    }
 
    return sem_id;
}
 
int set_semaphore (int sem_id, int val)
{
    return semctl(sem_id, 0, SETVAL, val);
}
 
void decrement_semaphore (int sem_id)
{
    struct sembuf sem_op;
 
    sem_op.sem_num  = 0;
    sem_op.sem_op   = -1;
    sem_op.sem_flg = 0;
 
    semop(sem_id, &amp;sem_op, 1);
}
 
void wait_semaphore (int sem_id)
{
    struct sembuf sem_op;
 
    sem_op.sem_num  = 0;
    sem_op.sem_op   = 0;
    sem_op.sem_flg = 0;
 
    semop(sem_id, &amp;sem_op, 1);
}
 
#endif

sync_all_processes.h

#include "sem_helper.h"
 
void sync_all_processes ()
{
    int sem_id;
    int rc;
 
    /* Get semaphore */
    sem_id = get_semaphore();
 
    /* Decrement semaphore value */
    decrement_semaphore (sem_id);
 
    /* Now wait till semaphore value reaches 0 */
    wait_semaphore (sem_id);
}

두 개의 프로그램의 실행 지점을 맞추는 것을 예로 들어보자. 프로그램 A와 프로그램 B의 원하는 지점에 sync_all_processes()를 삽입해 빌드한다. 우선 set_semaphore.cpp를 실행한다. 세마포어 변수가 2가 되도록 초기화하고, 세마포어 변수가 0이 되기까지 기다린 다음 체크포인트를 생성한다. 프로그램 A가 먼저 sync_all_processes()를 호출한다고 하자. 프로그램 A는 프로그램 B도 sync_all_processes 호출하기까지 기다린다. 프로그램 A와 B 모두 sync_all_processes()를 호출한 뒤에 진행할 수 있다. set_semaphore.cpp에서도 계속해서 진행할 수 있으며, 체크포인트를 생성한다.

나는 Python script를 사용해 체크포인트 생성을 하고 싶었기 때문에, Python에서 세마포어 변수를 사용할 수 있어야 했다. 그리고 Fortran으로 작성된 프로그램도 실행 시점을 맞춰야 하기 때문에, Fortran에서의 세마포어 사용법도 알아야 했다. Python에서의 세마포어 사용은 [3]에서 제공하는 System V 방식의 IPC 라이브러리를 사용했고, Fortran에서의 세마포어 사용은 C 함수를 호출하는 방식으로 해결했다.

우선 파이썬에서의 세마포어 사용을 위해 라이브러리를 설치한다. sysv-ipc 패키지를 설치한다.

$sudo pip install sysv-ipc

System V의 semaphore를 사용하는 예제는 라이브러리 홈페이지에서 제공하는 소스 코드에 포함되어 있다. 이를 참고해 C언어에서의 구현과 유사하도록 세마포어 생성을 구현함.

set_semaphore.py

#!/usr/bin/python
import sys 
import sysv_ipc

SEM_ID = 678 

def get_semaphore(sem_id):
    sem = sysv_ipc.Semaphore(sem_id)
    return sem 
        
def set_semaphore(sem_id, initial_value):
    while True:
        try :
            sem = sysv_ipc.Semaphore(sem_id, sysv_ipc.IPC_CREX, initial_value = initial_value)
            return sem 
        except:
            sem = get_semaphore(sem_id)
            sem.remove()
        pass

def wait_semaphore(sem):
    sem.Z()             #wait
    sem.remove()        #and remove

sem_val = int(sys.argv[1])
sem = set_semaphore(SEM_ID, sem_val)
wait_semaphore(sem)

print "call create_checkpoint here"

Python으로 작성된 워크로드를 실행하지는 않으므로, sync_all_processes() 함수는 구현하지 않음.

Fortran에서 System V 방식으로 세마포어를 사용하는 방법을 찾지 못함. C 함수를 Fortran 프로그램에서 호출하는 방식으로 해결하고자 함. C 함수를 Fortran에서 호출할 수 있다는 요지의 문서는 많으나, 구체적으로 그것을 어떻게 하는지 적혀있는 문서는 적었다. 한 문서에서 소스 코드를 온전히 제공하고 있어서 이를 참고함[5].

Fortran으로 작성된 다음 워크로드가 있다고 하자[4]. ‘Hello, world!’ 메시지가 출력되기 전에 멈춘 다음, 기다리고 싶다고 하자.

      program HelloWorld
          write (*,*) 'Hello, world!'   ! This is an inline comment
      end program HelloWorld

앞에서 본 함수인 sync_all_processes()를 호출하면 된다.

workload.f

      program HelloWorld
          call sync_all_processes()     ! Synchronize all workloads
          write (*,*) 'Hello, world!'   ! This is an inline comment
      end program HelloWorld

Fortran에서 C 함수를 호출할 때에는 _가 하나 더 붙는다. sync_all_processes() 함수의 경우, Fortran에서 sync_all_processes()라고 호출하고 C 파일에서는 sync_all_processes_()로 선언해주어야 한다. 그리고 extern C로 선언해주어야 한다. (Linkage 방식을 C++ 방식을 사용하지 않고 C 방식을 사용함)

sync_all_processes_fortran.cpp

/* This file provides basic function to synchronize multiple processes using
 * System V Semaphores.  It uses semaphore id 786 so please make sure none of
 * your benchmarks uses that ID. */

#ifndef SEM_HELPER_H
#define SEM_HELPER_H

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

static int SEM_ID = 678;

int get_semaphore ()
{
    int sem_id;

    sem_id = semget(SEM_ID, 1, IPC_CREAT | 0666);

    if (sem_id == -1) {
        perror("get_semaphore: semget");
        exit(1);
    }   

    return sem_id;
}

int set_semaphore (int sem_id, int val)
{
    return semctl(sem_id, 0, SETVAL, val);
}

void decrement_semaphore (int sem_id)
{
    struct sembuf sem_op;

    sem_op.sem_num  = 0;
    sem_op.sem_op   = -1; 
    sem_op.sem_flg = 0;

    semop(sem_id, &amp;sem_op, 1); 
}

void wait_semaphore (int sem_id)
{
    struct sembuf sem_op;

    sem_op.sem_num  = 0;
    sem_op.sem_op   = 0;
    sem_op.sem_flg = 0;

    semop(sem_id, &amp;sem_op, 1); 
}

extern "C" {
    void sync_all_processes_ (); 
}

void sync_all_processes_ ()
{
    int sem_id;
    int rc; 

    /* Get semaphore */
    sem_id = get_semaphore();

    /* Decrement semaphore value */
    decrement_semaphore (sem_id);

    /* Now wait till semaphore value reaches 0 */
    wait_semaphore (sem_id);
}
#endif

Makefile은 아래와 같다.

driver : set_semaphore.cpp
    g++ set_semaphore.cpp -o set_semaphore

workload_cpp :
    g++ workload.cpp -o workload_cpp
    
workload_fortran : workload.f sem_helper.h
    gfortran -c workload.f -o workload_f.o
    g++ -c sync_all_processes_fortran.cpp -o sync_all_processes_fortran.o
    gfortran -o workload_fortran workload_f.o sync_all_processes_fortran.o -lstdc++

clean :
    rm workload_fortran workload_cpp *.o

References :
[1] Avadh patel, Creating a Barrier between Processes with SysV Semaphore, http://marssandbeyond.blogspot.kr/2011/09/creating-barrier-between-processes-with.html
[2] Avadh patel, System V Semaphore based barrier across multiple processes, https://gist.github.com/avadhpatel/1246286
[3] System V IPC for Python, http://semanchuk.com/philip/sysv_ipc/
[4] Fortran/Fortran examples, WikiBooks, http://en.wikibooks.org/wiki/Fortran/Fortran_examples
[5] Andrew J. Pounds, Simple Examples for calling C/C++ from Fortran, http://theochem.mercer.edu/interlanguage/


3. SPEC CPU 2006 ROI 확인 중
이전에 정섭이 형이 알려준 ROI를 참고해 확인하는 중. 하지만 정섭이 형이 알려준 ROI도 신뢰할 수 없으며, ROI를 찾아내는게 쉬운 일이 아니다. Gprof를 사용해 ROI를 찾아내는 것도 고민 중.

runspec으로 SPEC CPU 2006 clean하고자 했으나, 잘 되지 않음.
다음 두 명령어로 파일을 지움.

$rm -Rf ./benchspec/CPU2006/*/exe/*
$rm -Rf ./benchspec/CPU2006/*/run/*

4. SIGFPGA
– ZedBoard에 대한 간단한 사용법 소개.
– 요즘 좋은 학회에 논문을 내려면 FPGA로 구현해야 한다.
– 인덱싱하는 것, 병렬 처리로 해결할 수 있는 것을 FPGA로 가속

Advertisements
Tagged with: , , , , , , , , , , , , , , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Recent Posts
누적 방문자 수
  • 146,251 hits
%d bloggers like this: