Programming/openMP2013. 3. 16. 17:34
#pragma omp 확장 외에도
openMP 지원을 위한 런타임 함수들과 환경변수들을 지원하는데
런타임 함수에 은근히 lock 관련이 있다는 사실에 놀라는 중.

2 Runtime Library Routines
  2.1 omp_get_active_level() - Number of parallel regions
  2.2 omp_get_ancestor_thread_num() - Ancestor thread ID
  2.3 omp_get_dynamic() - Dynamic teams setting
  2.4 omp_get_level() - Obtain the current nesting level
  2.5 omp_get_max_active_levels() - Maximum number of active regions
  2.6 omp_get_max_threads() - Maximum number of threads of parallel region
  2.7 omp_get_nested() - Nested parallel regions
  2.8 omp_get_num_procs() - Number of processors online
  2.9 omp_get_num_threads() - Size of the active team
  2.10 omp_get_schedule() - Obtain the runtime scheduling method
  2.11 omp_get_team_size() - Number of threads in a team
  2.12 omp_get_thread_limit() - Maximum number of threads
  2.13 omp_get_thread_num() - Current thread ID
  2.14 omp_in_parallel() - Whether a parallel region is active
  2.15 omp_in_final() - Whether in final or included task region
  2.16 omp_set_dynamic() - Enable/disable dynamic teams
  2.17 omp_set_max_active_levels() - Limits the number of active parallel regions
  2.18 omp_set_nested() - Enable/disable nested parallel regions
  2.19 omp_set_num_threads() - Set upper team size limit
  2.20 omp_set_schedule() - Set the runtime scheduling method
  2.21 omp_init_lock() - Initialize simple lock
  2.22 omp_set_lock() - Wait for and set simple lock
  2.23 omp_test_lock() - Test and set simple lock if available
  2.24 omp_unset_lock() - Unset simple lock
  2.25 omp_destroy_lock() - Destroy simple lock
  2.26 omp_init_nest_lock() - Initialize nested lock
  2.27 omp_set_nest_lock() - Wait for and set nested lock
  2.28 omp_test_nest_lock() - Test and set nested lock if available
  2.29 omp_unset_nest_lock() - Unset nested lock
  2.30 omp_destroy_nest_lock() - Destroy nested lock
  2.31 omp_get_wtick() - Get timer precision
  2.32 omp_get_wtime() - Elapsed wall clock time
3 Environment Variables
  3.1 OMP_DYNAMIC - Dynamic adjustment of threads
  3.2 OMP_MAX_ACTIVE_LEVELS - Set the maximum number of nested parallel regions
  3.3 OMP_NESTED - Nested parallel regions
  3.4 OMP_NUM_THREADS - Specifies the number of threads to use
  3.5 OMP_SCHEDULE - How threads are scheduled
  3.6 OMP_STACKSIZE - Set default thread stack size
  3.7 OMP_THREAD_LIMIT - Set the maximum number of threads
  3.8 OMP_WAIT_POLICY - How waiting threads are handled
  3.9 OMP_PROC_BIND - Whether theads may be moved between CPUs
  3.10 GOMP_CPU_AFFINITY - Bind threads to specific CPUs
  3.11 GOMP_STACKSIZE - Set default thread stack size

'Programming > openMP' 카테고리의 다른 글

openMP로 구현한 야매 sum()  (0) 2013.09.25
openmp 제한자(?)  (0) 2013.09.20
openMP 지시어  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
Posted by 구차니
Programming/openMP2013. 3. 16. 17:26
단순하게 for문 나눠서 돌릴때
#pragma omp parallel
#pragma omp for

혹은 
#pragma omp parallel for 

쓰레드 순서대로 실행해야 할 경우의 보조 지시어(그런데 이렇게 하면 병렬처리를 안하고 single로 순서대로 하는거 아닌가?)
#pragma omp parallel for ordered
#pragma omp ordered 

보조지시어 schedule을 이용한 for문의 분배방식
#pragma omp parallel for schedule(static)
#pragma omp parallel for schedule(dynamic)
#pragma omp parallel for schedule(guided)
#pragma omp parallel for schedule(runtime) 

parallel 구문에서 마스터 쓰레드만 돌릴경우 single을 사용함(물론 실행도 1번만)
#pragma omp parallel 
#pragma omp single 

멀티 쓰레드로 여러개의 작업(함수단위) 돌릴경우 sections 안에 함수별로 section을 사용함
#pragma omp parallel 
#pragma omp sections
#pragma omp section 

쓰레드 외부의 변수들을 복제해서 사용하도록 하는 private 보조 지시어(쓰레드 별로 복제되어 사용됨)
#pragma omp parallel private(variable)

atomic은 단순하게 변수에 값 할당 하는 정도의 단순한 lock 방법을 위한 아토믹 연산을 지원하며
critical은 critical section(OS 용어)을 지원하기 위해 함수나 비교, 할당등을 할 수 있는 확장된 지시어.
#pragma omp atomic
#pragma omp critical 

runtime 함수로 현재 실행중인 쓰레드의 번호(만약 쓰레드가 4개라면 0~3번 사이의)를 알려준다.
omp_get_thread_num() 

---
2013.09.20
#pragma omp parallel

#pragma omp for
#pragma omp sections
#pragma omp single
#pragma omp task


#pragma omp atomic
#pragma omp critical
#pragma omp master
#pragma omp barrier
#pragma omp taskwait
#pragma omp flush
#pragma omp ordered

#pragma omp threadprivate




#pragma omp parallel
if
num_threads
default(shared|none)
private
firstprivate
lastprivate
shared
copyin
reduction

#pragma omp for
private
firstprivate
lastprivate
reduction
schedule
collapse
ordered
nowait


#pragma omp sections
private
firstprivate
lastprivate
reduction
schedule
collapse
ordered
nowait


#pragma omp single
private
firstprivate
copyprivate
nowait



#pragma omp task // omp 3.0 above
if
united
default(shared|none)
private
firstprivate
shared
 

'Programming > openMP' 카테고리의 다른 글

openmp 제한자(?)  (0) 2013.09.20
openMP runtime 함수 및 환경변수  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
openMP 문서들  (0) 2012.06.18
Posted by 구차니
Programming/openMP2013. 3. 16. 08:05
결론만 말하자면
메뉴는 존재하지만 omp.h 헤더가 존재하지 않는다.

"구성 속성" - "C/C++" - "언어" - "OpenMP 지원"

 
하지만 정작 컴파일 하면
 fatal error C1083: 포함 파일을 열 수 없습니다. 'omp.h': No such file or directory

... openMP 윈도우용 라이브러리만 설치하면 되려나?


---
그냥 TBB나 PPL을 쓰라는 조언 -_-
[링크 : http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-1144-z-10.htm ]

2008 플랫폼 SDK를 설치하라는데 iso로 받으려니 1.5기가 덜덜덜
+깔아도 omp.h는 없는데!?!?
[링크 : http://stackoverflow.com/questions/1338016/visual-c-2008-omp-h-not-found-openmp-is-set]
[링크 : http://www.microsoft.com/en-us/download/details.aspx?id=24826 ]

'Programming > openMP' 카테고리의 다른 글

openMP runtime 함수 및 환경변수  (0) 2013.03.16
openMP 지시어  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
openMP 문서들  (0) 2012.06.18
openmp for문 나누기  (0) 2012.06.18
Posted by 구차니
Programming/C++ STL2013. 3. 15. 23:24
friend는 접근규칙(스코프?) 지정자로 함수와, 클래스에 지정할수 있다.

friend function의 경우 method가 아닌 일반 함수이면서 특정 class에 접근 권한을 지닌다.
아래의 예제에서 friend 함수인 duplicate의 구현 부분은
CRectangle duplicate() 로
CRectangle CRectangle:duplicate() 가 아님을 유의하며
using namespace std;

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area () {return (width * height);}
// friend CRectangle duplicate (CRectangle);
};

void CRectangle::set_values (int a, int b) {
width = a;
height = b;
}

CRectangle duplicate (CRectangle rectparam)
{
CRectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
}

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect, rectb;
rect.set_values (2,3);
rectb = duplicate (rect);
cout << rectb.area();
return 0;
}

CRectangle 클래스의 friend 함수를 주석으로 제거하면
friend로 예외처리가 되지 않기 때문에 private 변수인 width와 height에 접근할수 없기에
아래와 같은 에러가 발생하게 된다.
 error C2248: 'CRectangle::width' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다.
 error C2248: 'CRectangle::height' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다. 

+ 상속받은 클래스의 경우 어떻게 되나 소스를 개조했는데
상속받은 클래스 형으로 새롭게 함수를 정의하면 의미가 없어지고
단순하게 타입캐스팅도 못하고
상속받을 형으로 duplicate2 함수를 만들려고 하면 재귀적이라서 방법이 없고 -_-
아무튼 상속에 대해서는 friend 함수는 의미가 없으려나?




friend class의 경우
해당 class의 instance로 부터의 접근 권한을 허가한다.
위의 예제와 유사한데, class 내에서 다른 클래스에게 허가권을 주는 형식이다.
using namespace std;

class CSquare;

class CRectangle {
int width, height;
public:
int area () {return (width * height);}
void convert (CSquare a);
};

class CSquare {
private:
int side;
public:
void set_side (int a) {side=a;}
// friend class CRectangle;
};

void CRectangle::convert (CSquare a) {
width = a.side;
height = a.side;
}

int _tmain(int argc, _TCHAR* argv[])
{
CSquare sqr;
CRectangle rect;
sqr.set_side(4);
rect.convert(sqr);
cout << rect.area();
return 0;
} 

friend를 주석으로 제거시 conver 함수에서 sqr.a 에 접근할수 없으므로 아래와 같은 에러가 발생한다.
(sqr은 CSqaure class로 side는 private 변수이다. 그렇기에 CRectangle 클래스인 rect에서는 sqr.a를 접근할 수 없다)
 error C2248: 'CSquare::side' : private 멤버('CSquare' 클래스에서 선언)에 액세스할 수 없습니다.

+
이녀석도 상속하면 어떻게 되려나 궁금해지네...

[링크 : http://www.cplusplus.com/doc/tutorial/inheritance/]
Posted by 구차니
Programming/C++ STL2013. 3. 13. 20:31

1. 컨스트럭터가 하나라도 생성(오버로드) 되면 기본 생성자가 사용불능이 되기 때문에
   필요한 생성자들을 모두 만들어 주어야 한다. 
class abc
{
public:
int a;
abc(int);
// abc();
};

abc::abc(int val)
{
a = val;
} 
abc a; // error C2512: 'abc' : 사용할 수 있는 적절한 기본 생성자가 없습니다.

이러한 문제를 해결하기 위해서는 인자를 가지지 않는 생성자를 만들어야 한다.
class abc
{
public:
int a;
abc(int);
abc();
};

abc::abc(int val)
{
a = val;
}

abc::abc()
{
a = 0;
} 

 
2. 당연한(?) 것이지만 클래스 이름과 동일한 변수는 만들수 없다.
클래스 이름과 동일한 식별자는 '생성자'로 할당되기 때문
class abc
{
public:
int abc;
}; 
error C2039: 'a' : 'abc'의 멤버가 아닙니다.

3. 상속의 경우 상속된 내용에 대해서는 컨스트럭터가 적용된다.
class abc
{
public:
int a;
abc(int);
abc();
~abc();
};

abc::abc(int val) {a = val;}
abc::abc() {a = 2;}
abc::~abc() {cout << "die\n";}

class bbc : public abc
{
public:
int b;
};

int _tmain(int argc, _TCHAR* argv[])
{
abc a;
bbc b;

a.a = 1;
b.b = 2;
cout << b.a << "\n";
b.a = 3;
cout << b.a << "\n";
return 0;
} 

결과는
2
3
die
die 
Posted by 구차니
Programming/C++ STL2013. 3. 13. 20:18
눈으로만 보다 손으로 직접 코딩 -ㅁ-
몇줄 안되는데 막상 직접하려니 은근 까다롭네...
using namespace std;

class abc
{
public:
	int a;
};

class bbc : public abc
{
public:
	int b;
};

int _tmain(int argc, _TCHAR* argv[])
{
	abc a;
	bbc b;

	a.a = 1;
	b.b = 2;
	b.a = 3;
	return 0;
} 

디버거 돌리니까 아래와 같이 나오는데
중첩구조체 라는 느낌인데 약간의 차이(?) 라면
c 에서 b.abc.a 식으로 접근하던걸 b.a 로 상속된 항목에 접근할 수 있다는 정도?


Posted by 구차니
Programming/C++ STL2013. 3. 11. 19:07
계륵이라는 느낌
일단 내용만 보고 느껴지는 문제는
다중상속시 다른 클래스들을 파악해야 하므로
모듈/캡슐화를 통해 모르고 끌어쓰는 편리함을 포기해야 한다는 점?

물론 평행다중 상속이 아닌
수직다중 상속 같운 경우에도 scope문제로 바뀔뿐
재사용성을 위한 상속이 재사용성을 해치는 문제가 발생한다

[링크 : http://gyumee.egloos.com/3200829
[링크 : http://www.winapi.co.kr/clec/cpp3/29-3-2.htm]
[링크 : http://www.langdev.org/posts/20]
[링크 : http://cplusplus.com/doc/tutorial/inheritance/
Posted by 구차니
Programming/C++ STL2013. 3. 11. 19:04
포인터 변수 같은 느낌?

class deri : public a,b
에서
a는 public
b는 private로 된다고 하니 주의해야할듯

[링크 : http://www.gpgstudy.com/forum/viewtopic.php?topic=11211]

'Programming > C++ STL' 카테고리의 다른 글

visual studio express에서의 상속 클래스  (0) 2013.03.13
다중상속의 문제점  (0) 2013.03.11
c++ function overloading  (2) 2013.03.04
c++ class member function  (0) 2013.03.04
c++ namespace  (0) 2013.03.04
Posted by 구차니
Programming/C++ STL2013. 3. 4. 23:35
영어사전을 뒤져보면, overriding은 우선시 되서 하는 것이고 overloading은 과적이다.
overriding이 상속으로 함수의 내용을 갈아 엎는걸 의미하는 것을 보면 '최우선시'가 적당한것 같고
overloading은 하나의 이름으로 여러가지 일을 하는 것이니 '과적'도 적당한것 같고

그런데 막상 단어만 두면 엄청 헷갈리는 녀석이다 -_-

overriding 미국식 [|oʊvər|raɪdɪŋ] play 영국식 [|əʊvə|raɪdɪŋ] play 
다른 무엇보다 더 중요한, 최우선시 되는
overloading
(조선공학) 과적(過積)(고봉싣기)  



class CRectangle {
int width, height;
public:
CRectangle ();
CRectangle (int,int);
int area (void) {return (width*height);}
};

CRectangle::CRectangle () {
width = 5;
height = 5;
}

CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect (3,4);
CRectangle rectb;
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}  

일단 overloading의 제약사항은 아래의 세가지 이다.
동일 return type
동일 function name 
다른 function variable

c++의 동적 타입 바인딩을 통해서
컴파일 / 런타임 시에 입력받는 변수형을 추적하여 해당 함수로 연결해줄수 있지만
리턴되는 값이 들어가는 곳에 대해서는 형변환이 있을수도 있으니 어떤걸로 할 수 없으니 사용이 불가능 하다고
들은거 같긴한데 먼소리인지 모르겠고 -_- 

'Programming > C++ STL' 카테고리의 다른 글

다중상속의 문제점  (0) 2013.03.11
상속시 public, private 키워드는 하나씩만 적용된다  (0) 2013.03.11
c++ class member function  (0) 2013.03.04
c++ namespace  (0) 2013.03.04
c++ class와 struct  (0) 2013.03.03
Posted by 구차니
Programming/C++ STL2013. 3. 4. 23:15
class는 struct 에서 함수를 포함하는 개념인데
물론, class안에서 함수를 선언할수 있지만 확실히 보기 쉽지 않아지는게 문제이니
되도록이면 class 안에는 prototype만 선언하고 class 밖에서 함수 본체를 만들어 주는게 나을 듯하다.

class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
void ~CRectangle ()
{
delete width;
delete height;
}
int area () {return (*width * *height);}
};

void CRectangle::CRectangle (int a, int b) {
width = new int;
height = new int;
*width = a;
*height = b;
}

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
 

1. 생성자/소멸자는 리턴형이 존재하지 않는다.
    error C2577: 'CRectangle' : 소멸자은(는) 반환 형식을 가질 수 없습니다.
    error C2533: 'CRectangle::{ctor}' : 생성자에서 반환 형식을 사용할 수 없습니다.

2. class 안에 함수를 넣어도 무방하다
class name {
    function_name() { /* function content */ } 
    function_prototype(); 
}

return_type name::function_prototype()
{

[링크 : http://www.cplusplus.com/doc/tutorial/classes/]


---
그리고 c++에서 부터는 prototype에 변수의 형만 적고, 변수명을 생략가능해진다.
CRectangle (int,int);
CRectangle::CRectangle (int a, int b) { /* ... */ }

'Programming > C++ STL' 카테고리의 다른 글

상속시 public, private 키워드는 하나씩만 적용된다  (0) 2013.03.11
c++ function overloading  (2) 2013.03.04
c++ namespace  (0) 2013.03.04
c++ class와 struct  (0) 2013.03.03
c++ cout 제어하기  (0) 2013.02.15
Posted by 구차니