Adakah yang berhasil menginstal CUDA 7.5 di Ubuntu 14.04.3 LTS x86_64?

12

Workstation saya memiliki dua GPU (Quadro K5200 dan Quadro K2200) dengan Driver NVIDIA terbaru yang diinstal (Versi: 352.41). Setelah mengunduh file cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debdari CUDA 7.5 Unduhan , saya mencoba menginstalnya, tetapi ternyata hasilnya seperti di bawah ini:

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.

Saya sudah mencoba solusinya:

  1. sudo apt-get remove nvidia-cuda-* # hapus paket nvidia-cuda lama
  2. Instal dependensi yang belum terpenuhi:

    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. Instal dan gunakan aptitude

Ubuntu14.04 OS saya baru saja diinstal dan telah membuat pembaruan perangkat lunak dan menginstal driver Nvidia terbaru.

Bisakah kamu memberikan bantuan? Terima kasih sebelumnya!

Bruce Yo
sumber

Jawaban:

8

Instalasi CUDA sedikit rumit. Saya telah mengikuti langkah-langkah berikut dan itu berhasil untuk saya. Anda dapat merujuk ke tautan ini juga.

Konfirmasi lingkungan:

  1. lspci | grep -i nvidia (Konfirmasikan bahwa informasi dewan NVIDIA ditampilkan)

  2. uname -m (pastikan itu adalah x86_64)

  3. gcc --version (pastikan sudah terpasang)

Instalasi CUDA -

  1. Unduh cuda_7.5.18_linux.runfile dari https://developer.nvidia.com/cuda-downloads

  2. Jalankan perintah berikut:

    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. Mulai ulang komputer

  4. Pada layar login, tekan Ctrl+ Alt+ F1dan login ke pengguna Anda.

  5. Buka direktori tempat Anda memiliki driver CUDA, dan jalankan

    chmod a+x .
    sudo service lightdm stop
    sudo bash cuda-7.5.18_linux.run --no-opengl-libs
    
  6. Selama instalasi:

    • Terima persyaratan EULA
    • Katakan YA untuk menginstal driver NVIDIA
    • Katakan YA untuk menginstal CUDA Toolkit + Driver
    • Katakan YA untuk menginstal Sampel CUDA
    • Katakan TIDAK membangun kembali konfigurasi Xserver dengan Nvidia
  7. Periksa apakah /dev/nvidia*ada file. Jika tidak, lakukan hal berikut

    sudo modprobe nvidia
    
  8. Setel variabel lintasan Lingkungan

    export PATH=/usr/local/cuda-7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
    
  9. Verifikasi versi driver

    cat /proc/driver/nvidia/version`
    
  10. Periksa versi driver CUDA

    nvcc –V
    
  11. Nyalakan kembali lightdm

    sudo service lightdm start
    
  12. Ctrl+ Alt+ F7dan masuk ke sistem melalui GUI

  13. Buat Sampel CUDA, Buka NVIDIA_CUDA-7.5_Samplesfolder melalui terminal, lalu jalankan perintah berikut:

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

    Kedua tes akhirnya harus menghasilkan 'LULUS' di terminal

  14. Mulai ulang sistem

Avik
sumber
Terima kasih banyak! Ini akhirnya bekerja pada Asus UX32VD saya (laptop Optimus dengan GeForce 620M). Saya mencoba segalanya dan segalanya. Kemarin saya bisa mendapatkan nvidia-352 bekerja dengan Bumblebee, tetapi setelah menginstal CUDA toolkit, saya tidak bisa menjalankan sampel mana pun (seolah-olah saya tidak memiliki kartu CUDA, dan ya, saya menggunakan optirun). Driver lain menelurkan saya ke loop login atau hitam unity-greeter! Saya tidak bisa cukup berterima kasih
:)
Satu-satunya hal yang saya butuhkan untuk mengubah sini adalah dari optionke optionsdalam bagian nouveau blacklist.
TheM00s3
Saya memiliki desktop HP dengan NVIDIA GeForce GTX 680. Instruksi Anda sebagian besar berfungsi, kecuali bahwa driver kartu grafis yang datang dengan file run ( cuda_7.5.18_linux.run) menyebabkan lightdmberhenti bekerja setelah reboot (setelah grub, Anda akan melihat layar hitam dengan kursor berkedip tak berujung) ). Solusi saya adalah menghapus instalasi driver itu terlebih dahulu sudo apt-get purge nvidia-*, dan menginstalnya menggunakan file run terbaru yang diunduh dari situs web resmi NVIDIA. Dan itu bekerja dengan sempurna. Solusi alternatif akan menjadi seperti solusi (A) di askubuntu.com/a/676772/194156
Xin
2

Ada dua cara untuk menginstal setelan driver CUDA (untuk Optimus dan chipset grafis bawaan pada mainboards hybrid) - yang pertama dijelaskan di sini adalah yang termudah dan deskripsi kedua lebih rumit tetapi juga efektif:

SEBUAH)

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

B)

Deskripsi metode B ada di sini, tetapi sudah lebih tua (dijelaskan oleh pengguna dschinn1001) - metode B ini lebih memalukan dan bisa berisiko, tetapi tidak berbahaya. :

Bagaimana saya dapat menginstal Nvidia Driver GT 520 dan Cuda 5.0 di Ubuntu13.04?

Paket beta driver untuk Nvidia yang diunduh untuk Linux ada di sini:

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

Metode A lebih sederhana, tetapi tidak jelas, bagaimana ia berinteraksi dengan xscreensaver dan metode B lebih tua, tetapi paket driver diperbarui juga dalam waktu belakangan ini, dan setelah metode B dilakukan, itu harus bekerja lebih baik dengan dikondisikan xscreensaver bahwa xscreensaver adalah diinstal. (Saya menguji metode B pada 13.10 dan ini bekerja sangat baik, bahkan dengan xscreensaver. Dan saya pikir sisa utas ini tergantung pada perangkat kerasnya.)

Selain itu dan mengacu pada lebah dengan Optimus-graphics-chipset penyesuaian ini untuk lebah juga diperlukan:

Cara mengatur nVidia Optimus / Bumblebee di 14.04

dschinn1001
sumber
1

Kedengarannya seperti lp bug 1428972 .

Pengguna fennytansy menambahkan solusi di komentar # 10 :

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

pengguna3813819
sumber
setelah saya menjalankan layar perintah menjadi hitam. saya hanya dapat mengakses tty1? Apakah Anda tahu ada solusi lain?
Karesh Arunakirinathan
1

Saya berhasil menginstal CUDA menggunakan metode runfile. Pengaturan ini agak rumit karena driver grafis utama Anda juga harus diinstal menggunakan metode runfile ( Lihat Di Sini ).

Mencoba menginstal hanya pengemudi. Ini dapat dilakukan dengan menggunakan metode runfile. Ini akan meminta Anda untuk setiap bagian dari instalasi dan Anda dapat menonaktifkan GLperpustakaan dan toolkit. Pusat kendali persatuan telah memberi saya mengeluarkan juga dengan karena kebutuhan CUDA sampel untuk menggunakan libGLU.sobukan libGL.so. Ini adalah perbaikan yang mudah ketika membangun contoh pembelajaran Anda sendiri.

asdf
sumber
1

Coba hapus instalan driver nvidia, dan langsung instal cuda tanpa itu. Pada Ubuntu 14.04 yang baru, saya mengikuti instruksi dari situs nvidia . Selain memverifikasi versi yang kompatibel (gcc, kernel), petunjuknya adalah:

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

Untungnya, driver nvidia yang tepat telah diinstal sebagai produk sampingan dari langkah-langkah di atas.

mlysy
sumber
1

Saya menghabiskan satu hari penuh untuk menggunakan " ppa: graphics-drivers / ppa " untuk memperbarui driver NVIDIA ke versi 352. Semuanya gagal. Setelah satu pemasangan, gpu-manager.log melaporkan bahwa driver diinstal sementara Xorg.0.log akan melaporkan yang sebaliknya.

Driver nouveau telah dihapus dan dimasukkan ke daftar hitam: sudo apt-get --purge remove xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf blacklist opsi nouveau nouveau modeet = 0 alias nouveau dari alias lbm-nouveau pergi

Saya akhirnya menyerah dan menggunakan solusi "NVIDIA ... bin" murni.

  1. Nouveau daftar hitam, seperti yang ditunjukkan di atas.
  2. sepenuhnya menghapus nouveau Xserver seperti yang dikutip di atas.
  3. Atur BIOS sistem untuk memiliki PCIe (dua kartu nvidia) sebagai primer dan menonaktifkan antarmuka mainboard HD4600.
  4. boot ke mode pemulihan, jaringan diaktifkan, lalu pergi ke mode konsol.
  5. Jalankan "NVIDIA-Linux-x86_64-352.41.run -uninstall" hanya untuk memastikan tidak ada yang tersisa.
  6. Menghapus direktori lama di / etc, / usr / local, yang tampak seperti sisa dari instalasi cuda atau nvidia sebelumnya.
  7. Lari "NVIDIA-Linux-x86_64-352.41.run"
  8. Jalankan "NVIDIA-Linux-x86_64-352.41.run --check" untuk memverifikasi bahwa semuanya benar (benar).
  9. Kemudian jalankan "cuda_7.5.18_linux.run" untuk menyelesaikan instalasi. Semuanya sedang berjalan. Kedua monitor menyala dan berfungsi. Saat ini sedang mengerjakan pembuatan file sampel cuda. Pastikan untuk menggunakan flag "--help" pada nampan instal NVIDIA. Alasan utama saya memutuskan untuk pergi ke rute bin (bersama dengan salah satu alternatif yang tidak berfungsi, adalah bahwa pendekatan "bin" menyediakan rute yang mudah untuk pemulihan setelah pembaruan OpenGL "mesa". Hasil
pengguna225932
sumber
1

Saya reboot Ubuntu hari ini, dan menemukan ada sesuatu dependensi yang belum terpenuhi seperti libcog15 : Depends: mesa-driver...(saya tidak ingat nama paket lengkapnya), jadi saya biasa apt-get installmenginstal "mesa-driver". Setelah itu, CUDA 7.5 berhasil diinstal.

Perhatikan bahwa versi Kernel saya adalah 3.19.0-28-generik dan versi gcc adalah Ubuntu 4.8.4-2ubuntu1 ~ 14.04 , yang tidak ditemukan di dokumen resmi CUDA 7.5 . Saya akan memeriksa apakah itu benar-benar berfungsi.

Bruce Yo
sumber
1
Untuk beberapa alasan driver mesa di komputer saya menyebabkan segala macam masalah persatuan saat boot up dan menyebabkan kegagalan penuh pada sistem saya. Hati-hati.
asdf
@ Bruce Yo - Ini secara umum tidak hanya masalah mesa, ini tergantung pada chipset pada kartu nvidia-grafis-hybrid, yang semuanya berbeda. Anda harus mempertimbangkan solusi saya juga. : o)
dschinn1001
0

Saya mencoba sudo su dan apt-get install cuda, bukan sudo apt-get install cuda. Itu berhasil.

 sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
 sudo apt-get update
 sudo su
 apt-get install cuda
softgearko
sumber
Selamat Datang di Tanya Ubuntu, senang melihat Anda berbagi pengetahuan. Namun, ini bukan forum, ini adalah situs tanya jawab, periksa tur bantuan ini . Duplikat jawaban orang lain (dari pengguna 661266) tidak membantu, Anda akan dapat memilih ketika Anda mendapatkan reputasi yang cukup.
user.dz
@Sneetsher Terima kasih atas komentar Anda. Saya telah mencoba menjawab pertanyaan pengguna 661266 tetapi tidak berhasil. Ketika saya menggunakan "su" bukannya "sudo", itu berhasil. Saya tidak tahu persis mengapa. Namun, itu berhasil dengan uji coba saya. Saya percaya bahwa ada baiknya bagi seseorang untuk mencoba solusi saya.
softgearko
0

Silakan merujuk ke: https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.md . Hal ini terkait dengan pemasangan Caffe pada intinya tetapi juga menangani instalasi CUDA.

amirsina torfi
sumber
1
Hai @amirsani_torfi, selamat datang di ask.ubuntu. Perhatikan bahwa sementara tautan Anda mungkin menyediakan informasi yang diperlukan untuk menjawab pertanyaan yang diajukan, tautan dapat dihapus kapan saja. Saya menyarankan agar Anda mengedit pertanyaan Anda untuk memasukkan informasi penting dari tautan itu.
Tshilidzi Mudau
-1

-masalah dengan lightdm login (loop login)

-masalah dengan driver istall ("Instalasi Driver gagal: tampaknya, bahwa server X sedang berjalan ...")

Untuk berhasil menginstal NVidia CUDA Toolkit di Ubuntu 16.04 64bit, saya baru saja harus melakukan:

  1. buat liveImage dari Ubuntu dengan flashdisk (pena 8GB sudah cukup) - percobaan semacam itu akan menghemat banyak keberanian , sebelum instalasi yang gagal di sistem Linux host Anda !!!
  2. masuk pada sesi langsung pada pendrive ("Coba Ubuntu, sebelum menginstal")
  3. tambahkan pengguna sudo di sesi langsung:

    sudo adduser admin (#pass: admin1)

    sudo usermod -aG sudo admin

  4. keluar dari sesi langsung, masuk sebagai #admin

  5. unduh CUDA Toolkit dari situs resmi NVidia (~ 1.5GB)
  6. ubah hak istimewa untuk file pemasang yang diunduh (JANGAN INSTAL DI LANGKAH INI!):
    sudo chmod + x cuda_X.X.run

  7. beralih ke tampilan konsol:

    Ctr + Alt + F1 (untuk mengaktifkan tampilan terminal) Ctr + Alt + F7 (untuk beralih dari tampilan terminal ke server grafis)

  8. pada tampilan konsol (Ctr + Alt + F1) masuk:

    login: admin pass: admin1

  9. hentikan layanan berjalan grafis:

    layanan sudo berhenti lightdm

  10. periksa apakah server grafis mati - setelah beralih Ctr + Alt + F7 monitor harus kosong hitam, aktifkan kembali tampilan konsol Ctr + Alt + F1

  11. instal CUDA Toolkit, dengan konfigurasi seperti itu:

    sudo ./cuda_X.X.run (tekan 'q' untuk lewati lisensi baca) jangan instal pustaka OpenGL jangan perbarui konfigurasi sistem X pilihan lain buat yes dan path sebagai default

  12. nyalakan server grafis:

    sudo service lightdm start

  13. masuk sebagai pengguna (jika Anda secara otomatis masuk sebagai #ubuntu saat sesi keluar langsung):

    login: admin pass: admin1

  14. periksa kompilator nvcc apa pun yang berfungsi dengan jumlah vektor paralel sederhana yang disediakan di Blok GPU:

    simpan vecSum.cu dan book.h di file baru, kompilasi dan jalankan di terminal: /usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

  15. periksa hasil cetak konsol - harus sama dengan: 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. jika semuanya berjalan dengan baik pada sesi live flashdisk, lakukan hal yang sama pada sistem host linux Anda

PS Harap dicatat bahwa ini bukan tutorial yang ideal, tetapi berfungsi dengan baik untuk saya!

======= 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__
Piotr Lenarczyk
sumber