C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[24882] Re: C++빌더는 Open MP 지원 안합니다
참고 [] 6147 읽음    2014-09-22 21:40
C++빌더는 OpenMP 키워드를 그냥 무시하는 것일 뿐 OpenMP를 전혀 지원하지 않습니다.
OpenMP가 지원된다면 컴파일러가 CompilerRT 외부 함수가 되었든 아니면 빌트인 함수가
되었든 OpenMP를 지원하기 위한 히든 코드를 생성해줘야 하는데 C++빌더는 전혀 그런 코드를
생성하지 않습니다.

단순히 컴파일만 에러없이 되도록 OpenMP 키워드를 무시하는 겁니다.

쓰레드를 이용한 병렬처리는 부스트 까지 갈 필요도 없이 C++11 부터 지원되는 STL 라이브러리를
이용해도 되고요.

그러나 CPU 쓰레드를 이용한 병렬처리는 결국 한계가 있어서 FFT등의 고급연산처리를 빠른 속도로
처리하기 위해선 같은 병렬처리라도 GPU를 이용해야 하는데 C++ 빌더는 GPU는 아예 지원도 안하지요.

GPU 패러렐 연산을 지원하는 VC에 비하면 C++빌더는 아직 한참 멀었습니다. VC는 C++14 까지 지원하고
C++빌더 컴파일러는 완성도가 한참 뒤 떨어 집니다.

이렇게 느려터진 지원으로 볼때 XE10 이 나와도 컴파일러가 완성도 갖춰서 제대로 나올지는 의문이네요
이젠 기대를 접은지도 오래지만 후후




둘리.CSIEDA 님이 쓰신 글 :
: XE7 에 parallel programming 이 된다고 해서 iso 다운받아 vm에 설치해서 테스트 해 보았습니다.
:
: 금방 지워버릴거라.. 정성은 드리지 않았습니다.
:
: 그냥 2 부터 50000 까지 prime number 를 찾는 루프를 만들어서 테스트 했습니다.
:
: C++ For Loop : 438 msec
: TParallel Loop : 214 msec
:
: 확실히 빠르긴 한데.. 소스코드를 쭉 살펴보면 결국 thread를 쓴다는 것 입니다.
: 굳이 갈필요가.. OMP 지원하는것도 아니고..(OMP 지원하나요?)
:
: 그냥 boost thread로 조금 더 짜주면 될듯 합니다.
:
: 실행중 memo 에 update하는것은 생략.. 이거 넣으면 결국 thread sync 걸려서 속도 더 늦습니다.
:
: 순수한 계산만 하는데에 사용해야..
:
: 차리리 직접 thread 만들어 나름대로 컨트롤 하는것이 좋을지도 모릅니다.
:
: 다운받고, 설치하고.. 몇시간 잡아먹었네요...
:
: 다소 실망....
:
:
: //---------------------------------------------------------------------------
:
: #ifndef Unit1H
: #define Unit1H
: //---------------------------------------------------------------------------
: #include <System.Classes.hpp>
: #include <Vcl.Controls.hpp>
: #include <Vcl.StdCtrls.hpp>
: #include <Vcl.Forms.hpp>
: //---------------------------------------------------------------------------
: class TForm1 : public TForm
: {
: __published:    // IDE-managed Components
:     TButton *Button1;
:     TMemo *Memo1;
:     TButton *Button2;
:     void __fastcall Button1Click(TObject *Sender);
:     void __fastcall Button2Click(TObject *Sender);
: private:    // User declarations
:     class TMyThread : public TThread
:     {
:         TForm1 *form;
:     public:
:         __fastcall TMyThread(TForm1 *form)
:             : TThread(true)
:         {
:             this->form = form;
:         }
:         void __fastcall MyIteratorEvent(TObject* Sender, int AIndex)
:         {
:             if(IsPrime(AIndex))
:             {
:                 //form->Memo1->Lines->Add(AIndex);
:             }
:
:         }
:         void __fastcall Execute(void)
:         {
:             TParallel::For(NULL, 1, 50000, TMyThread::MyIteratorEvent);
:
:         }
:
:     };
:     TMyThread *thread;
:
: public:        // User declarations
:     __fastcall TForm1(TComponent* Owner);
: };
: //---------------------------------------------------------------------------
: extern PACKAGE TForm1 *Form1;
: //---------------------------------------------------------------------------
: #endif
:
:
: //---------------------------------------------------------------------------
: bool IsPrime(int N)
: {
:     for(int i=2;i<N;i++)
:     {
:         if(N % i==0)
:         {
:             return false;
:         }
:     }
:     return true;
: }
:
: #include <System.Threading.hpp>
: #include <System.Diagnostics.hpp>
:
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit1.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
:
: //---------------------------------------------------------------------------
:
: __fastcall TForm1::TForm1(TComponent* Owner)
:     : TForm(Owner)
: {
:     Memo1->Lines->Clear();
: }
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:
:     TStopwatch Timer;
:     Timer = TStopwatch::StartNew();
:
:     #pragma omp parallel
:     for(int i=1;i<50000;i++)
:     {
:         if(IsPrime(i))
:         {
:            //    Memo1->Lines->Add(i);
:         }
:     }
:     UnicodeString s;
:     s.printf(L"C++ For Loop : %d msec",Timer.ElapsedMilliseconds);
:
:     Memo1->Lines->Add(s);
:
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
: //    Memo1->Lines->Clear();
:     thread = new TMyThread(this);
:
:     TStopwatch Timer;
:     Timer = TStopwatch::StartNew();
:
:     thread->Start();
:     thread->WaitFor();
:
:     UnicodeString s;
:     s.printf(L"TParallel Loop : %d msec",Timer.ElapsedMilliseconds);
:
:     Memo1->Lines->Add(s);
:
:
:
: }
: //---------------------------------------------------------------------------
:

+ -

관련 글 리스트
24872 TParallel. XE7 테스트 둘리.CSIEDA 6021 2014/09/17
24882     Re: C++빌더는 Open MP 지원 안합니다 참고 6147 2014/09/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.