Category: CPP

  • Basic Shapes

    Basic Shapes

    Çizgi, çember, dikdörtgen gibi basit şekilleri çizdirmek için OpenCV’nin bize sunmuş olduğu bazı fonksiyonlar var. Bu fonksiyonları kullanarak basit bir deneme yapacağız. Öncelikle bu fonksiyonların bazılarını tanıyalım Şimdi koordinat sistemi demişken OpenCV’de tam olarak nasıl çalıştığına bakalım. Normalde X-ekseni sağa Y-ekseni yukarıya doğru artan değerlere sahiptir. OpenCV de ise Y-ekseni tam tersi olup aşağıya doğru…

  • Warp Divergence

    GPU’da thread’ler warp adı verilen 32 thread‘lik gruplar halinde yürütülür. Bir warp içindeki thread’ler aynı instruction stream’i takip ederek farklı data üzerinde çalışır. Buraya kadar her şey güzel. Sıkıntı, farklı instructionlar çalışması gerektiğinde başlıyor. Örneğin if() koşulu koyduğumuzda threadlerin bir kısmı if bloğunu bir kısmı else bloğunu çalıştıracak. Fakat bir warp içinde her iki bloğun…

  • Measuring Execution Time

    Yaptığımız işlemin daha optimize olup olmadığını anlayabilmek için ne kadar sürede çalıştığını ölçmemiz gerekli. Bu ölçümü ilk başta std::chrono kullanarak cpu üzerinden yapacağız. Daha sonra cudaEvent(?) ile gpu üzerinde ölçüm yapmayı da göreceğiz fakat o başka bir posttun konusu. githubda gördüğüm bir kodu sınıfa döktüm: Daha sonra kernel’ı çalıştırırken Dikkat ederseniz asekron olduğu için cudaDeviceSynchronize()…

  • CUDA Device Properties

    GPU’nun özelliklerini sorgulamak istiyorsak bunu kullanıyoruz. Böylece üstünde çalıştığımız sistem hakkında daha fazla bilgi edinebiliriz. Çok fazla sayıda özellik var. Bir kısmı aşağıda listelenmiştir.

  • CUDA Error Handling

    Çeşitli CUDA fonksiyonları dönüş tipi olarak cudaError_t döndürür. Bunu yakalayıp bir if checkiyle başarılı olup olmadığını kontrol ediyoruz. Genelde bu iş için Macro yazılıyormuş. gibi

  • GPU Memory and Data Transfer

    Bazen tek başına bir array atmak yeterli olmaz yanında size da göndermemiz gerekir:

  • Kernel Dimensions

    Herhangi bir döngü yazarken genelde (int i =0; i<N; i++) gibi şeyler kullanarak içinde bulunduğumuz indexi ayarlarız. Aynı olayı GPU da yapamıyoruz. Bize sunulan threadIdx, blockIdx gibi ifadelerle içinde bulunduğumuz indexi hesaplayabiliriz. Bu kavramlara daha önceki yazıda değinmiştik. Şimdi biraz daha detaylı bakalım Indexing Eğer çok boyutlu arraylerin indexlerinin nasıl hesaplandığının mantığını biliyorsanız bunun mantığını…

  • Hello CUDA

    Bazı Kavramlar Kurulum Hello CUDA Şimdi <<< >>> olayına gelelim direk N tane thread çalışsın demek yerine bu şekilde bölerek dağıtıyoruz. Bu biraz donanımsal bir mesele. burada tek boyutlu dimension kullanıyoruz ama 2-3 boyutlu da yapabiliriz. Misal bir resmi işlerken 26. pixel yerine 27. satırdaki 14. pixel daha kullanışlı Burada sınırlarımız sonsuz değil. Misal benim…

  • CPP 063 – Execution Policy

    std algoritmalarının çalışma şeklinin paralel, sequential veya vectorized olup olmadığını belirlemek için kullanıyoruz.

  • CPP 062 – packaged_task & async

    packaged_task bir callable objeyi paketleyip sonucunu daha sonra kulanabiliriz. Senkron ya da asekron olarak çalışabilir. Eğer aynı thread de ise sekron olarak çalışır: Farklı thread’de asekron olarak da çalıştırabiliriz: packaged_task şablonu: Async packaged_task ile aşağı yukarı aynı işi yapıyor ama daha high level diyebiliriz. Sekron ya da asekron çalışabilir: future objesi implicitly olarak thread join…

  • CPP 060 – Thread Synchronization

    Progress Bar Bir fetcher thread ve bir progress bar thread’i arasındaki sekronizasyonu sağlamak için mutex ve flaglar(data_ready ve complete) kullandık. Threadlerin yaptıklarını özetlemek gerekirse: Fetcher thread Progres bar thread İşler bittince completed flag ile programdan çıkış yapıyoruz. Gördüğünüz üzere bu yaklaşım bu işi yapmak için en iyi yaklaşım değil. Çünkü bir çok yerde lock unlock…

  • CPP 059 – Dead Lock & Live Lock

    Dead Lock A devam edebilmek için B ye, B de devam edebilmek için doğrudan ya da dolayı yoldan A ya ihtiyacı varsa bu bir dead lock oluyor. Live Lock Live lock da tıpkı deadlock gibidir ama halen işlemin devam ettiğine dair bir hayat belirtisi vardır:

  • CPP 058 – Working With Shared Data

    Critical Section Data race’in gerçekleşebileceği bölgeye critical section diyoruz. Yani kritik bölge, bir kaza/bir yanlışın çıkabileceği alan. Aşağıdaki kodda brute force bir çarpma işlemi yapıyoruz. 20 farklı thread aynı değişkeni 10’000’er defa ++(increment) ediyor. sonuç 200’000 olmalı. Fakat kritik bölgeye dikkat etmediğimizde yanlış sonuç elde ediyoruz: Bu koddaki kritik bölge: Mutex Mutual exclusive’in kısaltması. 4…

  • CPP 057 – Thread Giriş

    Thread ID sleep_for() belirtilen süre kadar thread i uyutur: Thread Object Thread RAII idiomunu implemente etmiştir ve sadece move edilebilir: Return ederken bizim yerimize compiler optimize ediyor: Exceptions Thread içinde handle edlimeli. If I have a C++11 program running two threads, and one of them throws an unhandled exception, what happens? Will the entire program…

  • CPP 056 – Concurency

    Concurency Nedir? Concurency(eşzamanlılık) aynı anda birden fazla görevin yerine getirilmesidir. Maillerinizi okurken, arka planda çalan müzik bunun bir örneğidir. Bilgisayarımızda aynı anda yüzlerce hatta binlerce ufak program/kod parçası aynı anda çalışıyor. Yeni nesil mimarilerin hepsi(?) çok çekirdekli ama eski tek çekirdekli bilgisayarlarda bile bizler farklı işleri aynı anda yapabiliyorduk. Bu durumda eşzamanlılık kavramı sadece farklı…