eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpenMP - jest szybciej czy wolniej? › Re: OpenMP - jest szybciej czy wolniej?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!glegroupsg2000goo.googl
    egroups.com!not-for-mail
    From: Roman W <b...@g...pl>
    Newsgroups: pl.comp.programming
    Subject: Re: OpenMP - jest szybciej czy wolniej?
    Date: Mon, 5 Mar 2012 03:02:00 -0800 (PST)
    Organization: http://groups.google.com
    Lines: 103
    Message-ID: <16246163.3061.1330945320697.JavaMail.geo-discussion-forums@vblb5>
    References: <4f4feb4d$0$1271$65785112@news.neostrada.pl><jip3ao$9u9$...@n...news.atma
    n.pl><4f501330$0$26703$65785112@news.neostrada.pl><jip477$asl$...@n...new
    s.atman.pl><4f50b4a4$0$26698$65785112@news.neostrada.pl><jiqdm3$dvn$5@ine
    ws.gazeta.pl>
    <4f50bea4$0$1268$65785112@news.neostrada.pl><jiqfeg$dvn$...@i...gazeta.pl
    ><4f50c486$0$26685$65785112@news.neostrada.pl><jiqhqe$dvn$...@i...gazeta.
    pl>
    <jiqi0e$dvn$10@inews.gazeta.pl><4f50ddac$0$1279$6...@n...neostrada.p
    l><jiqqlu$dvn$13@inews.gazeta.pl><4f50f4d2$0$26694$6...@n...neostrad
    a.pl> <jiqt59$dvn$15@inews.gazeta.pl>
    <4f50fa41$0$26701$65785112@news.neostrada.pl>
    <jisdma$441$1@inews.gazeta.pl>
    <4f51eeb2$0$1213$65785112@news.neostrada.pl>
    <jit2t8$q3u$1@inews.gazeta.pl> <jiuvio$ea6$1@inews.gazeta.pl>
    <20754956.1627.1330856982202.JavaMail.geo-discussion-forums@vbxv4>
    <jivip6$9jm$1@inews.gazeta.pl>
    NNTP-Posting-Host: 193.189.80.39
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: quoted-printable
    X-Trace: posting.google.com 1330945793 27060 127.0.0.1 (5 Mar 2012 11:09:53 GMT)
    X-Complaints-To: g...@g...com
    NNTP-Posting-Date: Mon, 5 Mar 2012 11:09:53 +0000 (UTC)
    In-Reply-To: <jivip6$9jm$1@inews.gazeta.pl>
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=193.189.80.39;
    posting-account=EexxQQoAAAAkOfWz0VZRKLcHNpXJZLB9
    User-Agent: G2/1.0
    Xref: news-archive.icm.edu.pl pl.comp.programming:195985
    [ ukryj nagłówki ]

    On Sunday, March 4, 2012 11:13:42 AM UTC, wrote:
    > Roman W <b...@g...pl> napisał(a):
    >
    > > On Sunday, March 4, 2012 5:46:00 AM UTC, M.M. wrote:
    > > > Zawsze narzut na utworzenie watkow jest duzy, to nie wina OpenMP.
    > >
    > > Jezeli tworzysz watki recznie, narzut jest znacznie mniejszy.
    >
    > Mozesz to jakos uzasadnic i opisac jak uzywasz slowa "recznie"?
    > Pozdrawiam

    A kto pyta? ;-)

    Mialem na mysli np. cos takiego:

    #include <boost/thread.hpp>
    #include <boost/timer.hpp>
    #include <iostream>
    #include <sstream>
    #include <cmath>

    template <class T> class global_data
    {
    public:
    global_data(const T& data = T())
    : m_data(data)
    {
    }

    T& get() { return m_data; }
    const T& get() const { return m_data; }
    boost::mutex& mutex() { return m_mutex; }
    private:
    boost::mutex m_mutex;
    T m_data;
    };

    template <class T> struct summator
    {
    summator(global_data<T>* d, T b, T e)
    : begin(b), end(e), data(d)
    {
    }

    void operator()()
    {
    T sum = T();
    for (T i = begin; i < end; ++i)
    sum += cos(i);
    {
    boost::lock_guard<boost::mutex> total_sum_lock(data->mutex());
    data->get() += sum;
    }
    }

    T begin;
    T end;
    global_data<T>* data;
    };

    template <class T> summator<T> make_summator(global_data<T>* d, T b, T e)
    {
    return summator<T>(d, b, e);
    }

    int main(int argc, char* argv[])
    {
    size_t n;
    size_t d;
    if (argc < 3) {
    std::cerr << "Usage: " << argv[0] << " array-size number-of-threads" << std::endl;
    return -1;
    } else {
    std::stringstream ss;
    ss << argv[1];
    ss >> n;
    ss.clear();
    ss << argv[2];
    ss >> d;
    }
    if (n % d != 0) {
    std::cerr << "array-size not exactly divisible by number-of-threads: " << n << "
    and " << d << std::endl;
    return -1;
    }
    const size_t s = n / d;
    boost::thread_group tg;
    global_data<double> total_sum(0.0);
    for (size_t i = 0; i < d; ++i) {
    tg.create_thread(make_summator(&total_sum, static_cast<double>(i*s), (i + 1.0)*s));
    }
    tg.join_all();
    std::cout << "Total sum == " << total_sum.get() << std::endl;
    }


    Nawet dla parametrow przy ktorych program dziala tylko kilkanascie sekund (array-size
    = 1000000) 2 watki wykonuja sie znacznie szybciej niz 1, a 4 to juz ho-ho.

    RW

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: