Ubuntu 14.04.3 LTS x86_64'e CUDA 7.5'i başarıyla yükleyen var mı?


12

İş istasyonumda en son NVIDIA Sürücüsü (Sürüm: 352.41) yüklü iki GPU (Quadro K5200 ve Quadro K2200) var. Dosyayı indirdikten sonra cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debgelen CUDA 7.5 İndirme , bunu yüklemeye çalışırken, ancak aşağıdaki gibi bir sonuç çıkıyor:

root@P700-Bruce:/home/bruce/Downloads# sudo apt-get install cuda
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 cuda : Depends: cuda-7-5 (= 7.5-18) but it is not going to be installed
 unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                        Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

Çözümü denedim:

  1. sudo apt-get remove nvidia-cuda-* # eski nvidia-cuda paketlerini kaldırın
  2. Karşılanmayan bağımlılıkları yükleyin:

    root@P700-Bruce:/home/bruce/Downloads# apt-get install cuda-7-5
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     cuda-7-5 : Depends: cuda-toolkit-7-5 (= 7.5-18) but it is not going to be installed
                Depends: cuda-runtime-7-5 (= 7.5-18) but it is not going to be installed
     unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                            Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
    
    root@P700-Bruce:/home/bruce/Downloads# apt-get install cuda-toolkit-7-5
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     cuda-toolkit-7-5 : Depends: cuda-core-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-command-line-tools-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-samples-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-documentation-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-visual-tools-7-5 (= 7.5-18) but it is not going to be installed
     unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                            Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
    
  3. Yükleme ve kullanma becerisi

Ubuntu14.04 İşletim Sistemim yeni kuruldu ve yazılım güncellemelerini yaptı ve en son Nvidia sürücüsünü yükledi.

Yardım edebilir misin? Şimdiden teşekkürler!

Yanıtlar:


8

CUDA'nın kurulumu biraz zor. Aşağıdaki adımları izledim ve benim için çalışıyor. Bu bağlantıya da başvurabilirsiniz .

Çevrenin onaylanması:

  1. lspci | grep -i nvidia (NVIDIA panosundaki bilgilerin görüntülendiğini doğrulayın)

  2. uname -m (bunun x86_64 olduğundan emin olun)

  3. gcc --version (kurulu olduğundan emin olun)

CUDA Kurulumu -

  1. Https://developer.nvidia.com/cuda-downloads adresindencuda_7.5.18_linux.run dosya indirin

  2. Aşağıdaki komutları çalıştırın:

    sudo apt-get install build-essential
    echo blacklist nouveau option nouveau modeset=0 |sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf 
    sudo update-initramfs -u
    
  3. Bilgisayarı yeniden başlat

  4. Oturum açma ekranında Ctrl+ Alt+ tuşlarına basın F1ve kullanıcı oturum açın.

  5. CUDA sürücüsünün bulunduğu dizine gidin ve çalıştırın

    chmod a+x .
    sudo service lightdm stop
    sudo bash cuda-7.5.18_linux.run --no-opengl-libs
    
  6. Yükleme sırasında:

    • EULA koşullarını kabul edin
    • NVIDIA sürücüsünü yüklemek için EVET deyin
    • CUDA Toolkit + Driver'ı yüklemek için EVET deyin
    • CUDA Örneklerini kurmak için EVET deyin
    • Nvidia ile herhangi bir Xserver yapılandırmasını yeniden oluşturma NO deyin
  7. /dev/nvidia*Dosyaların olup olmadığını kontrol edin . Eğer yapmazlarsa, aşağıdakileri yapın

    sudo modprobe nvidia
    
  8. Ortam yolu değişkenlerini ayarlama

    export PATH=/usr/local/cuda-7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
    
  9. Sürücü sürümünü doğrulayın

    cat /proc/driver/nvidia/version`
    
  10. CUDA sürücü sürümünü kontrol edin

    nvcc –V
    
  11. Lightdm'yi tekrar açın

    sudo service lightdm start
    
  12. Ctrl+ Alt+ F7ve GUI üzerinden sisteme giriş

  13. CUDA Örnekleri oluşturun, NVIDIA_CUDA-7.5_Samplesterminalden klasöre gidin , ardından aşağıdaki komutu çalıştırın:

    make
    cd bin/x86_64/linux/release/
    ./deviceQuery
    ./bandwidthTest
    

    Her iki test de nihayetinde terminalde bir 'PASS' vermelidir

  14. Sistemi yeniden başlatın


Çok teşekkürler! Sonunda Asus UX32VD (GeForce 620M'li Optimus dizüstü bilgisayar) üzerinde çalışıyor. Her şeyi ve her şeyi denedim. Dün nvidia-352'yi Bumblebee ile çalıştırabilirdim, ancak CUDA araç setini yükledikten sonra, herhangi bir örneği çalıştıramadım (CUDA kartım yokmuş gibi, evet kullanıyordum optirun). Diğer sürücüler beni giriş döngülerine veya siyah haline getirdi unity-greeter! Size yeterince teşekkür edemem
:)

Burada değiştirmek için gereken tek şey oldu optioniçin optionskara liste nouveau bölümünde.
TheM00s3

NVIDIA GeForce GTX 680 ile bir HP masaüstüm var. Çalıştırmanızla birlikte gelen grafik kartı sürücüsünün ( cuda_7.5.18_linux.run) lightdmyeniden başlatıldıktan sonra çalışmayı bırakmasına neden olması dışında, talimatınız çoğunlukla işe yaradı ( grubtan sonra sonsuz yanıp sönen imleç ile siyah bir ekran göreceksiniz ). Benim çözümüm, önce bu sürücüyü kaldırmak sudo apt-get purge nvidia-*ve NVIDIA resmi web sitesinden indirilen en son çalışma dosyasını kullanarak kurmaktı. Ve mükemmel çalışıyor. Alternatif bir çözüm, askubuntu.com/a/676772/194156
Xin

2

Uygun CUDA sürücüsünü kurmanın iki yolu vardır (Optimus ve hibrit anakartlarda yerleşik grafik yonga setleri için) - burada açıklanan ilk en kolay ve ikinci açıklama daha hantal ama etkilidir:

A)

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-355 nvidia-prime
sudo reboot

B)

B yönteminin açıklaması burada, ancak zaten daha eski (dschinn1001 kullanıcısı tarafından açıklanmaktadır) - bu B yöntemi daha alçakgönüllüdür ve riskli olabilir, ancak zararlı olmayabilir. :

Ubuntu13.04'te Nvidia Sürücü GT 520 ve Cuda 5.0'ı nasıl yükleyebilirim?

Nvidia'nın Linux için indirmesi gereken beta sürücü paketi burada:

http://www.nvidia.de/object/cuda_1_1_beta.html

Yöntem A daha basit, ancak net değil, xscreensaver ile nasıl etkileşime girdiğini ve B yöntemi daha eski olduğunu, ancak sürücü paketi son zamanlarda da güncellenir ve yöntem B yapıldıktan sonra, xscreensaver'ın koşullu olduğu xscreensaver ile daha iyi çalışmalıdır. Kurulmuş. (13.10'da B yöntemini test ettim ve bu xscreensaver ile bile çok iyi çalışıyordu. Ve bu iş parçacığının geri kalanının donanıma kadar olduğunu düşünüyorum.)

Buna ek olarak ve Optimus grafik yonga setlerine sahip yaban arısı ile ilgili olarak, yaban arısı için bu ayarlamalar da gereklidir:

14.04'te nVidia Optimus / Bumblebee nasıl kurulur


1

Lp bug 1428972 gibi geliyor .

Kullanıcı fennytansy # 10 yorumuna bir geçici çözüm ekledi :

sudo apt-get install libglew-dev libcheese7 libcheese-gtk23 libclutter-gst-2.0-0 libcogl15 libclutter-gtk-1.0-0 libclutter-1.0-0


Ben çalıştırdıktan sonra komut ekranı siyah oldu. sadece tty1 erişebilir miyim? Başka çözüm biliyor musunuz?
Karesh Arunakirinathan

1

CUDA'yı runfile yöntemini kullanarak başarıyla yükledim. Birincil grafik sürücüsü çünkü kurulum için biraz daha yanıltıcıdır da runfile yöntemi (kullanarak yüklü olması gerekir İşte bakınız ).

Yalnızca sürücüyü yüklemeyi deneyin . Bu, runfile yöntemi kullanılarak yapılabilir. Yüklemenin her bölümü için sizi GLuyarır ve kitaplıkları ve araç setlerini devre dışı bırakabilirsiniz . Birlik kontrol merkezi, CUDA örneğinin libGLU.soyerine kullanma ihtiyacı nedeniyle bana da sorunlar veriyor libGL.so. Bu, kendi öğrenme örneklerinizi oluştururken kolay bir düzeltmedir.


1

Nvidia sürücüsünü kaldırmayı ve onsuz doğrudan cuda yüklemeyi deneyin. Yeni bir Ubuntu 14.04'te nvidia web sitesindeki talimatları takip ettim . Şeylerin uyumlu sürümlerini (gcc, çekirdek) doğrulamanın yanı sıra, talimatlar şunlardı:

sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb 
sudo apt-get update
sudo apt-get install cuda 

Mutlu bir şekilde, doğru nvidia sürücüsü yukarıdaki adımların bir yan ürünü olarak kuruldu.


1

NVIDIA sürücülerini 352 sürümüne güncellemek için " ppa: grafik sürücüleri / ppa " kullanmak için tam bir gün geçirdim . Her şey başarısız oldu. Bir kurulumdan sonra gpu-manager.log, sürücülerin Xorg.0.log aksini bildirirken yüklendiğini bildirdi.

Nouveau sürücüsü kaldırıldı ve kara listeye alındı: sudo apt-get --purge kaldır xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf kara liste nouveau seçenekleri nouveau modeset = 0 alias nouveau off alias lbm-nouveau kapalı

Sonunda vazgeçtim ve tamamen "NVIDIA ... bin" çözümü kullandım.

  1. Yukarıda gösterildiği gibi kara listeye alınan nouveau.
  2. nouveau Xserver'ı yukarıda belirtildiği gibi tamamen kaldırdı.
  3. Sistem bios'unu PCIe (iki nvidia kartı) birincil olacak şekilde ayarlayın ve anakart HD4600 arayüzünü devre dışı bırakın.
  4. kurtarma moduna önyükleme, ağ etkinleştirildi, sonra konsol moduna geçti.
  5. Hiçbir şeyin kalmadığından emin olmak için "NVIDIA-Linux-x86_64-352.41.run -uninstall" komutunu çalıştırın.
  6. / Etc, / usr / local dizininde, geçmiş cuda veya nvidia yüklemelerinin kalıntıları gibi görünen eski dizinler silindi.
  7. "NVIDIA-Linux-x86_64-352.41.run" koştu
  8. Her şeyin doğru olduğunu doğrulamak için "NVIDIA-Linux-x86_64-352.41.run --check" komutunu çalıştırın.
  9. Sonra yüklemeyi tamamlamak için "cuda_7.5.18_linux.run" komutunu çalıştırın. Şu anda işler çalışıyor. Her iki monitör de çalışır durumda. Şu anda cuda örnek dosyaları oluşturma üzerinde çalışıyor. NVIDIA yükleme kutularında "--help" bayraklarını kullandığınızdan emin olun. Bin yoluna gitmeye karar vermemin temel nedeni (çalışmayan alternatiflerden biri ile birlikte "bin" yaklaşımının "mesa" OpenGL güncellemesinden sonra kurtarma için kolay bir yol sağlamasıdır. Sonuç

1

Bugün Ubuntu'yu yeniden başlattım ve başka bir karşılanmamış bağımlılık olduğunu libcog15 : Depends: mesa-driver...gördüm (tam paket adını hatırlayamıyorum), bu yüzden apt-get install"mesa-driver" ı yüklerdim. Bundan sonra, CUDA 7.5 başarıyla kuruldu.

Çekirdek sürümümün 3.19.0-28-genel ve gcc sürümünün CUDA 7.5 resmi belgelerinde bulunmayan Ubuntu 4.8.4-2ubuntu1 ~ 14.04 olduğunu unutmayın . Gerçekten işe yarayıp yaramadığını kontrol edeceğim.


1
Herhangi bir nedenle bilgisayarımdaki mesa sürücüsü, önyükleme sırasında her türlü birlik sorununa neden oldu ve sistemimin tamamen başarısız olmasına neden oldu. Dikkatli ol.
asdf

@Bruce Yo - Bu genel olarak sadece mesa meselesi değil, hepsi farklı olan hibrid nvidia-grafik kartlarındaki yonga setlerine bağlıdır. Benim çözümümü de düşünmelisin. : o)
dschinn1001

0

Sudo su ve apt-get install cuda yerine sudo apt-get install cuda denedim. İşe yaradı.

 sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
 sudo apt-get update
 sudo su
 apt-get install cuda

Bilgi paylaştığınızı görmek ne güzel Ubuntu'ya hoş geldiniz. Ancak, bu bir forum değil, bu bir Soru-Cevap sitesi, bu yardım turuna bakın . Başkalarının cevaplarını çoğaltmak (661266 kullanıcıdan) yardımcı olmaz, yeterli itibar kazandığınızda oyunuzu yükseltebilirsiniz.
user.dz

@Sneetsher Yorumunuz için teşekkür ederiz. 661266 kullanıcının yanıtını denedim ama işe yaramadı. "Sudo" yerine "su" kullandığımda işe yaradı. Nedenini tam olarak bilmiyorum. Ancak, benim deneme ile çalıştı. Çözümümü denemenin bir zaman için değerli olduğuna inanıyorum.
softgearko

0

Lütfen şu adrese bakın: https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.md . Özünde Caffe kurulumu ile ilgilidir, ancak CUDA kurulumunu da ele alır.


1
Merhaba @amirsani_torfi, ask.ubuntu'ya hoş geldiniz. Bağlantınız, sorulan soruyu yanıtlamak için gerekli bilgileri sunsa da, bağlantıların her zaman kaldırılabileceğini unutmayın. Bunun yerine sorunuzu, bu bağlantıdaki önemli bilgileri içerecek şekilde düzenlemenizi öneririz.
Tshilidzi Mudau

-1

-lightdm oturum açma ile ilgili sorunlar (oturum açma döngüsü)

-sürücü istall ile ilgili sorunlar ("Sürücü Kurulumu başarısız oldu: bir X sunucusu çalışıyor ...")

Ubuntu 16.04 64bit'e bir NVidia CUDA Toolkit'i başarıyla kurmak için şunları yaptım:

  1. pendrive'da bir Ubuntu görüntüsü yapın (8GB kalem yeterlidir) - böyle bir deneme, ana Linux sisteminize başarısız bir şekilde yüklemeden önce bir ton siniri kurtaracaktır !!!
  2. pendrive'da canlı oturumda oturum açın ("Yüklemeden önce Ubuntu'yu deneyin")
  3. canlı oturumda sudo kullanıcısı ekle:

    sudo adduser admin (#pass: admin1)

    sudo usermod -aG sudo yöneticisi

  4. canlı oturumdan çık, #admin olarak giriş yap

  5. CUDA Toolkit'i NVidia resmi sitesinden indirin (~ 1.5GB)
  6. indirilen yükleyici dosyası için ayrıcalıkları değiştir (BU ADIMDA KURMAYIN!):
    sudo chmod + x cuda_X.X.run

  7. konsol görünümüne geç:

    Ctr + Alt + F1 (terminal görünümünü açmak için) Ctr + Alt + F7 (terminal görünümünden grafik sunucusuna geçmek için)

  8. konsol görünümünde (Ctr + Alt + F1) giriş yapın:

    giriş: admin pass: admin1

  9. grafik çalışan hizmet durdurmak:

    sudo service lightdm durdur

  10. grafik sunucusunun kapalı olup olmadığını kontrol edin - Ctr + Alt + F7 tuşlarını açtıktan sonra monitör boş siyah olmalı, konsol görünümünü tekrar aç Ctr + Alt + F1

  11. CUDA Toolkit'i şu yapılandırmayla yükleyin:

    sudo ./cuda_X.X.run (lisans okuma atlaması için 'q' tuşuna basın) OpenGL kütüphanesini kurmayın sistem X yapılandırmasını güncellemez Diğer seçenekler evet ve yolları varsayılan olarak yapar

  12. grafik sunucuyu aç:

    sudo service lightdm başlat

  13. kullanıcı olarak oturum açın (canlı oturum oturumunda otomatik olarak #ubuntu olarak oturum açarsanız):

    giriş: admin pass: admin1

  14. GPU Bloklarında sağlanan basit paralel vektör toplamıyla nvcc derleyicisinin çalıştığını kontrol edin:

    vecSum.cu ve book.h dosyasını yeni dosyalara kaydedin, derleyin ve terminalde çalıştırın: /usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

  15. kontrol konsolu çıktısı - şuna benzer olmalıdır: 0.000000 + 0.000000 = 0.000000

    -1.100000 + 0.630000 = -0.000000
    
    -2.200000 + 2.520000 = 0.319985
    
    -3.300000 + 5.670000 = 2.119756
    -4.400000 + 10.080000 = 5.679756
    -5.500000 + 15.750000 = 10.250000
    -6.600000 + 22.680000 = 16.017500
    -7.700000 + 30.870001 = 23.170002
    -8.800000 + 40.320000 = 31.519997
    -9.900000 + 51.029999 = 41.129967
    
  16. pendrive canlı oturumunda her şey yolunda giderse, ev sahibi linux sisteminizde de aynısını yapın

PS Lütfen ideal bir öğretici olmadığını, ancak benim için iyi çalışıyor unutmayın!

======= vecSum.cu =====

#include "book.h"
#define N 50000
///usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

//"HOST" = CPU
//"Device" = GPU

__global__ void add( float *a, float *b, float *c )
{
    int tid = blockIdx.x;
    if ( tid < N )
        c[ tid ] = a[ tid ] + b[ tid ];
}

int main ( void )
{
    float a[ N ], b[ N ], c[ N ];
    float *dev_a, *dev_b, *dev_c;
    //GPU memory allocation
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_a, N * sizeof( float ) ) );
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_b, N * sizeof( float ) ) );
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_c, N * sizeof( float ) ) );

    //sample input vectors CPU generation
    for ( int i = 0; i < N; i++ )
    {
        a[ i ] = -i * 1.1;
        b[ i ] = i * i * 0.63;
    }

    //copy/load from CPU to GPU data vectors a[], b[] HostToDevice
    HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof( float ), cudaMemcpyHostToDevice ) );
    HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof( float ), cudaMemcpyHostToDevice ) );

    //calculate sum of vectors on GPU
    add<<<N,1>>> ( dev_a, dev_b, dev_c );

    //copy/load result vector from GPU to CPU c[] DeviceToHost
    HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof( float ), cudaMemcpyDeviceToHost ) );

    //printout results
    for ( int i = 0; i < 10; i++ ) printf( "%f + %f = %f\n", a[ i ], b[ i ], c[ i ] );

    //free memory and constructed objects on GPU
    cudaFree( dev_a );
    cudaFree( dev_b );
    cudaFree( dev_c );

    return 0;
}

========= book.h ======

/*
 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and
 * proprietary rights in and to this software and related documentation.
 * Any use, reproduction, disclosure, or distribution of this software
 * and related documentation without an express license agreement from
 * NVIDIA Corporation is strictly prohibited.
 *
 * Please refer to the applicable NVIDIA end user license agreement (EULA)
 * associated with this source code for terms and conditions that govern
 * your use of this NVIDIA software.
 *
 */


#ifndef __BOOK_H__
#define __BOOK_H__
#include <stdio.h>

static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))


#define HANDLE_NULL( a ) {if (a == NULL) { \
                            printf( "Host memory failed in %s at line %d\n", \
                                    __FILE__, __LINE__ ); \
                            exit( EXIT_FAILURE );}}

template< typename T >
void swap( T& a, T& b ) {
    T t = a;
    a = b;
    b = t;
}


void* big_random_block( int size ) {
    unsigned char *data = (unsigned char*)malloc( size );
    HANDLE_NULL( data );
    for (int i=0; i<size; i++)
        data[i] = rand();

    return data;
}

int* big_random_block_int( int size ) {
    int *data = (int*)malloc( size * sizeof(int) );
    HANDLE_NULL( data );
    for (int i=0; i<size; i++)
        data[i] = rand();

    return data;
}


// a place for common kernels - starts here

__device__ unsigned char value( float n1, float n2, int hue ) {
    if (hue > 360)      hue -= 360;
    else if (hue < 0)   hue += 360;

    if (hue < 60)
        return (unsigned char)(255 * (n1 + (n2-n1)*hue/60));
    if (hue < 180)
        return (unsigned char)(255 * n2);
    if (hue < 240)
        return (unsigned char)(255 * (n1 + (n2-n1)*(240-hue)/60));
    return (unsigned char)(255 * n1);
}

__global__ void float_to_color( unsigned char *optr,
                              const float *outSrc ) {
    // map from threadIdx/BlockIdx to pixel position
    int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
    int offset = x + y * blockDim.x * gridDim.x;

    float l = outSrc[offset];
    float s = 1;
    int h = (180 + (int)(360.0f * outSrc[offset])) % 360;
    float m1, m2;

    if (l <= 0.5f)
        m2 = l * (1 + s);
    else
        m2 = l + s - l * s;
    m1 = 2 * l - m2;

    optr[offset*4 + 0] = value( m1, m2, h+120 );
    optr[offset*4 + 1] = value( m1, m2, h );
    optr[offset*4 + 2] = value( m1, m2, h -120 );
    optr[offset*4 + 3] = 255;
}

__global__ void float_to_color( uchar4 *optr,
                              const float *outSrc ) {
    // map from threadIdx/BlockIdx to pixel position
    int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
    int offset = x + y * blockDim.x * gridDim.x;

    float l = outSrc[offset];
    float s = 1;
    int h = (180 + (int)(360.0f * outSrc[offset])) % 360;
    float m1, m2;

    if (l <= 0.5f)
        m2 = l * (1 + s);
    else
        m2 = l + s - l * s;
    m1 = 2 * l - m2;

    optr[offset].x = value( m1, m2, h+120 );
    optr[offset].y = value( m1, m2, h );
    optr[offset].z = value( m1, m2, h -120 );
    optr[offset].w = 255;
}


#if _WIN32
    //Windows threads.
    #include <windows.h>

    typedef HANDLE CUTThread;
    typedef unsigned (WINAPI *CUT_THREADROUTINE)(void *);

    #define CUT_THREADPROC unsigned WINAPI
    #define  CUT_THREADEND return 0

#else
    //POSIX threads.
    #include <pthread.h>

    typedef pthread_t CUTThread;
    typedef void *(*CUT_THREADROUTINE)(void *);

    #define CUT_THREADPROC void
    #define  CUT_THREADEND
#endif

//Create thread.
CUTThread start_thread( CUT_THREADROUTINE, void *data );

//Wait for thread to finish.
void end_thread( CUTThread thread );

//Destroy thread.
void destroy_thread( CUTThread thread );

//Wait for multiple threads.
void wait_for_threads( const CUTThread *threads, int num );

#if _WIN32
    //Create thread
    CUTThread start_thread(CUT_THREADROUTINE func, void *data){
        return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, data, 0, NULL);
    }

    //Wait for thread to finish
    void end_thread(CUTThread thread){
        WaitForSingleObject(thread, INFINITE);
        CloseHandle(thread);
    }

    //Destroy thread
    void destroy_thread( CUTThread thread ){
        TerminateThread(thread, 0);
        CloseHandle(thread);
    }

    //Wait for multiple threads
    void wait_for_threads(const CUTThread * threads, int num){
        WaitForMultipleObjects(num, threads, true, INFINITE);

        for(int i = 0; i < num; i++)
            CloseHandle(threads[i]);
    }

#else
    //Create thread
    CUTThread start_thread(CUT_THREADROUTINE func, void * data){
        pthread_t thread;
        pthread_create(&thread, NULL, func, data);
        return thread;
    }

    //Wait for thread to finish
    void end_thread(CUTThread thread){
        pthread_join(thread, NULL);
    }

    //Destroy thread
    void destroy_thread( CUTThread thread ){
        pthread_cancel(thread);
    }

    //Wait for multiple threads
    void wait_for_threads(const CUTThread * threads, int num){
        for(int i = 0; i < num; i++)
            end_thread( threads[i] );
    }

#endif




#endif  // __BOOK_H__
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.