Ubuntu 14.04.3 LTS x86_64에 CUDA 7.5를 성공적으로 설치 한 사람이 있습니까?


12

내 워크 스테이션에는 최신 NVIDIA 드라이버가 설치된 두 개의 GPU (Quadro K5200 및 Quadro K2200)가 있습니다 (버전 : 352.41). CUDA 7.5 Downloadscuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb 에서 파일 을 다운로드 한 후 설치하려고하는데 다음과 같은 결과가 나옵니다.

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.

나는 해결책을 시도했다 :

  1. sudo apt-get remove nvidia-cuda-* # 오래된 nvidia-cuda 패키지 제거
  2. 충족되지 않은 종속성을 설치하십시오.

    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. 적성 설치 및 사용

내 Ubuntu14.04 OS가 방금 설치되었으며 소프트웨어를 업데이트하고 최신 Nvidia 드라이버를 설치했습니다.

도움을 줄 수 있습니까? 미리 감사드립니다!

답변:


8

CUDA 설치는 약간 까다 롭습니다. 나는 다음 단계를 수행했으며 그것은 나를 위해 작동합니다. 이 링크를 참조 할 수도 있습니다.

환경 확인 :

  1. lspci | grep -i nvidia (NVIDIA 보드 정보가 표시되는지 확인하십시오)

  2. uname -m (x86_64인지 확인하십시오)

  3. gcc --version (설치되어 있는지 확인하십시오)

CUDA 설치 –

  1. https://developer.nvidia.com/cuda-downloadscuda_7.5.18_linux.run 에서 파일 다운로드

  2. 다음 명령을 실행하십시오.

    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. 컴퓨터 재부팅

  4. 로그인 화면에서 Ctrl+ Alt+를 누르고 F1사용자에게 로그인하십시오.

  5. CUDA 드라이버가있는 디렉토리로 이동하여

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

    • EULA 조건에 동의
    • NVIDIA 드라이버 설치에 예라고 말하십시오
    • CUDA 툴킷 + 드라이버 설치에 예라고 말하십시오
    • CUDA 샘플 설치에 예라고 말하십시오
    • Nvidia를 사용하여 Xserver 구성을 다시 작성하지 마십시오.
  7. /dev/nvidia*파일이 존재 하는지 확인하십시오 . 그렇지 않은 경우 다음을 수행하십시오.

    sudo modprobe nvidia
    
  8. 환경 경로 변수 설정

    export PATH=/usr/local/cuda-7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
    
  9. 드라이버 버전 확인

    cat /proc/driver/nvidia/version`
    
  10. CUDA 드라이버 버전 확인

    nvcc –V
    
  11. lightdm을 다시 켜십시오

    sudo service lightdm start
    
  12. Ctrl+ Alt+ F7GUI를 통해 시스템에 로그인

  13. CUDA 샘플을 생성 NVIDIA_CUDA-7.5_Samples하고 터미널을 통해 폴더로 이동 한 후 다음 명령을 실행하십시오.

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

    두 테스트 모두 궁극적으로 터미널에서 'PASS'를 출력해야합니다

  14. 시스템을 재부팅


고마워요! 이것은 마침내 내 Asus UX32VD (GeForce 620M이 장착 된 Optimus 랩톱)에서 작동합니다. 나는 모든 것을 시도했다. 어제 나는 Bumblebee와 함께 nvidia-352를 사용할 수 있었지만 CUDA 툴킷을 설치 한 후에는 샘플을 실행할 수 없었습니다 (CUDA 카드가없는 것처럼 예 optirun). 다른 드라이버가 로그인 루프 또는 검은 색으로 나를 스폰했습니다 unity-greeter! 나는 충분히 감사하지 않습니다
:)

여기서 변경해야 할 유일한 것은 블랙리스트 누보 섹션 내 에서 option로 변경되었습니다 options.
TheM00s3

NVIDIA GeForce GTX 680이 설치된 HP 데스크탑이 있습니다. 실행 파일 ( cuda_7.5.18_linux.run) 과 함께 제공되는 그래픽 카드 드라이버가 lightdm재부팅 후 작동을 멈추게 한다는 점을 제외하고는 대부분 지시 사항이 작동했습니다. ). 내 솔루션은로 해당 드라이버를 먼저 제거 sudo apt-get purge nvidia-*하고 NVIDIA 공식 웹 사이트에서 다운로드 한 최신 실행 파일을 사용하여 설치하는 것이 었습니다. 그리고 그것은 완벽하게 작동합니다. 대체 솔루션은 askubuntu.com/a/676772/194156
Xin

2

적합한 CUDA 드라이버를 설치하는 방법에는 두 가지가 있습니다 (Optimus 및 기타 내장형 그래픽 칩셋의 경우 하이브리드 메인 보드). 여기에서 처음으로 설명하는 것이 가장 쉽고 두 번째 설명이 더 번거롭지 만 효과적입니다.

ㅏ)

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

비)

방법 B에 대한 설명은 여기 있지만 이미 더 오래되었습니다 (사용자 dschinn1001에 의해 설명 됨).이 방법 B는 더 겸손하고 위험 할 수 있지만 위험하지는 않습니다. :

Ubuntu13.04에서 Nvidia Driver GT 520 및 Cuda 5.0을 어떻게 설치합니까?

Linux 용 Nvidia 용 베타 드라이버 패키지는 다음과 같습니다.

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

방법 A는 더 간단하지만 명확하지는 않지만 xscreensaver와 상호 작용하는 방법과 방법 B는 더 오래되었지만 최근에는 드라이버 패키지도 업데이트되며 방법 B가 완료된 후 xscreensaver를 사용하면 xscreensaver가 설치되었습니다. (나는 13.10에서 방법 B를 테스트했으며 xscreensaver에서도 매우 잘 작동했습니다.이 스레드의 나머지 부분은 하드웨어에 달려 있다고 생각합니다.)

또한 옵티머스 그래픽 칩셋을 사용하는 땅벌과 관련하여 땅벌에 대한 이러한 조정도 필요합니다.

14.04에서 nVidia Optimus / Bumblebee를 설정하는 방법


1

lp 버그 1428972 같은 소리 .

사용자 fennytansy는 의견 # 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


명령을 실행 한 후 명령 화면이 검은 색이되었습니다. tty1에만 액세스 할 수 있습니까? 다른 솔루션을 알고 있습니까?
Karesh Arunakirinathan

1

runfile 메소드를 사용하여 CUDA를 성공적으로 설치했습니다. 기본 그래픽 드라이버 runfile 메소드를 사용하여 설치 해야하므로 설정이 약간 까다 롭습니다 ( 여기 참조 ).

드라이버 설치하십시오 . runfile 메소드를 사용하여 수행 할 수 있습니다. 설치의 각 부분을 묻는 메시지가 표시되며 GL라이브러리와 툴킷을 비활성화 할 수 있습니다 . 단일 제어 센터는 CUDA 샘플이 libGLU.so대신 사용해야 할 필요성으로 인해 문제를 제기했습니다 libGL.so. 이것은 자신의 학습 예제를 만들 때 쉽게 해결됩니다.


1

nvidia 드라이버를 제거하고없이 cuda를 직접 설치하십시오. 신선한 우분투 14.04에서 나는 nvidia 웹 사이트 의 지시를 따랐습니다 . 호환 가능한 버전 (gcc, 커널)을 확인하는 것 외에도 지침은 다음과 같습니다.

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

행복하게도, 올바른 nvidia 드라이버가 위 단계의 부산물로 설치되었습니다.


1

종일 하루 종일 " ppa : graphics-drivers / ppa "를 사용하여 NVIDIA 드라이버를 버전 352로 업데이트했습니다. 모든 것이 실패했습니다. 한 번 설치 한 후 gpu-manager.log는 드라이버가 설치되었다고보고했으며 Xorg.0.log는 그 반대를보고했습니다.

nouveau 드라이버가 제거되고 블랙리스트에 추가되었습니다 : sudo apt-get --purge xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf blacklist nouveau 옵션 nouveau modeset = 0 alias nouveau off alias 제거 lbm-nouveau 할인

마침내 "NVIDIA ... bin"솔루션을 포기하고 사용했습니다.

  1. 위와 같이 블랙리스트에 등록 된 누보.
  2. 위에서 언급 한대로 nouveau Xserver를 완전히 제거했습니다.
  3. PCIe (2 개의 nvidia 카드)를 기본으로 설정하고 메인 보드 HD4600 인터페이스를 비활성화하도록 시스템 BIOS를 설정하십시오.
  4. 복구 모드로 부팅하고 네트워크를 활성화 한 다음 콘솔 모드로 전환했습니다.
  5. 아무것도 남기지 않도록 "NVIDIA-Linux-x86_64-352.41.run -uninstall"을 실행하십시오.
  6. / etc, / usr / local에서 이전 cuda 또는 nvidia 설치의 잔존물 인 이전 디렉토리를 삭제했습니다.
  7. "NVIDIA-Linux-x86_64-352.41.run"실행
  8. "NVIDIA-Linux-x86_64-352.41.run --check"를 실행하여 모든 것이 올바른지 확인하십시오.
  9. 그런 다음 "cuda_7.5.18_linux.run"을 실행하여 설치를 완료하십시오. 상황이 현재 작동하고 있습니다. 두 모니터가 모두 작동 중입니다. 현재 cuda 샘플 파일을 작성하는 중입니다. NVIDIA 설치 저장소에서 "--help"플래그를 사용해야합니다. 내가 bin 경로로 가기로 결정한 주된 이유는 다른 방법 중 하나가 작동하지 않기 때문에 "bin"접근 방식이 "mesa"OpenGL 업데이트 후에 쉽게 복구 할 수 있기 때문입니다. 결과

1

나는 오늘 우분투를 재부팅했고, libcog15 : Depends: mesa-driver...(전체 패키지 이름을 기억할 수 없다) 와 같은 또 다른 불충분 한 의존성이 있다는 것을 알았으므로 apt-get install"메사 드라이버"를 설치했다. 그 후 CUDA 7.5가 성공적으로 설치되었습니다.

내 커널 버전은 3.19.0-28-generic 이고 gcc 버전은 Ubuntu 4.8.4-2ubuntu1 ~ 14.04 이며 CUDA 7.5 공식 문서 에는 없습니다 . 실제로 작동하는지 확인하겠습니다.


1
어떤 이유로 든 내 컴퓨터의 mesa 드라이버는 부팅시 모든 종류의 단일성 문제를 일으켜 시스템의 전체 오류를 일으켰습니다. 조심해.
asdf

@Bruce Yo-이것은 일반적으로 메사의 문제 일뿐 만 아니라 하이브리드 엔비디아 그래픽 카드의 칩셋에 달려 있으며 모두 다릅니다. 내 솔루션도 고려해야합니다. : o)
dschinn1001

0

sudo apt-get install cuda 대신 sudo su 및 apt-get install cuda를 시도했습니다. 효과가있었습니다.

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

Ask Ubuntu에 오신 것을 환영합니다. 지식을 나누게되어 반갑습니다. 그러나 이것은 포럼이 아니며 Q & A 사이트 입니다. 이 도움말 둘러보기를 확인하십시오 . 661266 명의 사용자 중 다른 사람의 답변을 복제해도 도움이되지 않으므로 충분한 평판을 얻으면 투표 할 수 있습니다.
user.dz

@Sneetsher 귀하의 의견에 감사드립니다. 661266 사용자의 답변을 시도했지만 작동하지 않았습니다. "sudo"대신 "su"를 사용하면 효과가있었습니다. 왜 그런지 모르겠습니다. 그러나 그것은 나의 재판과 함께 일했다. 내 솔루션을 시도하는 동안 누군가에게 가치가 있다고 생각합니다.
softgearko

0

https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.md를 참조하십시오 . 본질적으로 Caffe 설치와 관련이 있지만 CUDA 설치에도 적용됩니다.


1
안녕하세요 @amirsani_torfi, ask.ubuntu에 오신 것을 환영합니다. 링크가 요청한 질문을 해결하는 데 필요한 정보를 제공 할 수 있지만 링크는 언제든지 제거 될 수 있습니다. 대신 해당 링크의 중요한 정보를 포함하도록 질문을 편집하는 것이 좋습니다.
Tshilidzi Mudau

-1

-lightdm 로그인 문제 (로그인 루프)

-드라이버 istall 관련 문제 ( "드라이버 설치 실패 : X 서버가 실행중인 것 같습니다 ...")

Ubuntu 16.04 64 비트에 NVidia CUDA 툴킷을 성공적으로 설치하려면 방금 수행해야했습니다.

  1. pendrive에 Ubuntu의 liveImage를 만드십시오 (8GB 펜이면 충분합니다)-그러한 시도는 호스트 리눅스 시스템에 성공적으로 설치하기 전에 많은 신경을 절약 할 것입니다 !!!
  2. pendrive에서 라이브 세션에 로그인 ( "설치하기 전에 Ubuntu를 사용해보십시오")
  3. 라이브 세션에서 sudo 사용자 추가 :

    sudo adduser admin (#pass : admin1)

    sudo usermod -aG sudo 관리자

  4. 라이브 세션에서 로그 아웃하고 #admin으로 로그인하십시오.

  5. NVidia 공식 사이트에서 CUDA 툴킷 다운로드 (~ 1.5GB)
  6. 다운로드 한 설치 프로그램 파일에 대한 권한 변경 (이 단계에서 설치하지 마십시오!) :
    sudo chmod + x cuda_X.X.run

  7. 콘솔보기로 전환하십시오.

    Ctr + Alt + F1 (터미널보기를 전환) Ctr + Alt + F7 (터미널보기를 그래픽 서버로 전환)

  8. 콘솔보기에서 (Ctr + Alt + F1) 로그인 :

    로그인 : 관리자 패스 : admin1

  9. 그래픽 실행 서비스 중지 :

    sudo 서비스 lightdm 중지

  10. 그래픽 서버가 꺼져 있는지 확인-Ctr + Alt + F7을 전환 한 후 모니터가 검은 색으로 표시되고 콘솔보기에서 다시 전환 Ctr + Alt + F1

  11. 다음과 같은 구성으로 CUDA 툴킷을 설치하십시오 :

    sudo ./cuda_X.X.run (라이센스 읽기 건너 뛰기 위해 'q'를 누름) OpenGL 라이브러리를 설치하지 마십시오 시스템 X 구성을 업데이트하지 않습니다. 다른 옵션은 예와 경로를 기본값으로 설정합니다

  12. 그래픽 서버를 켜십시오.

    sudo 서비스 lightdm start

  13. 사용자로 로그인 (실시간 세션 로그 아웃시 #ubuntu로 자동 로그인하는 경우) :

    로그인 : 관리자 패스 : admin1

  14. GPU 블록에서 제공된 간단한 병렬 벡터 합계로 nvcc 컴파일러가 작동하는 것을 확인하십시오.

    vecSum.cu 및 book.h를 새 파일에 저장하고 터미널에서 컴파일하여 실행하십시오. /usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

  15. 콘솔 출력 확인-다음과 유사해야합니다 : 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 라이브 세션에서 잘 진행 되었다면 호스트 리눅스 시스템에서 동일하게 수행하십시오.

추신 : 이상적인 자습서는 아니지만 나에게 잘 작동합니다.

======= 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__
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.