Có ai đã cài đặt thành công CUDA 7.5 trên Ubuntu 14.04.3 LTS x86_64 chưa?


12

Máy trạm của tôi có hai GPU (Quadro K5200 và Quadro K2200) với Trình điều khiển NVIDIA mới nhất được cài đặt (Phiên bản: 352.41). Sau khi tải xuống tệp cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debtừ CUDA 7.5 Tải xuống , tôi cố gắng cài đặt nó, nhưng hóa ra kết quả như sau:

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.

Tôi đã thử giải pháp:

  1. sudo apt-get remove nvidia-cuda-* # xóa các gói nvidia-cuda cũ
  2. Cài đặt phụ thuộc chưa được đáp ứng:

    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. Cài đặt và sử dụng năng khiếu

Hệ điều hành Ubuntu14.04 của tôi vừa được cài đặt và đã thực hiện các bản cập nhật phần mềm và cài đặt trình điều khiển Nvidia mới nhất.

Bạn có thể giúp đỡ không? Cảm ơn trước!

Câu trả lời:


8

Việc cài đặt CUDA hơi khó khăn một chút. Tôi đã làm theo các bước sau và nó hoạt động với tôi. Bạn có thể tham khảo liên kết này cũng.

Xác nhận môi trường:

  1. lspci | grep -i nvidia (Xác nhận rằng thông tin về bo mạch của NVIDIA được hiển thị)

  2. uname -m (đảm bảo rằng đó là x86_64)

  3. gcc --version (đảm bảo nó được cài đặt)

Cài đặt CUDA -

  1. Tải xuống cuda_7.5.18_linux.runtệp từ https://developer.nvidia.com/cuda-doads

  2. Chạy các lệnh sau:

    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. Khởi động lại máy tính

  4. Tại màn hình đăng nhập, nhấn Ctrl+ Alt+ F1và đăng nhập vào người dùng của bạn.

  5. Chuyển đến thư mục nơi bạn có trình điều khiển CUDA và chạy

    chmod a+x .
    sudo service lightdm stop
    sudo bash cuda-7.5.18_linux.run --no-opengl-libs
    
  6. Trong quá trình cài đặt:

    • Chấp nhận điều kiện EULA
    • Nói CÓ với cài đặt trình điều khiển NVIDIA
    • Nói CÓ với cài đặt CUDA Toolkit + Driver
    • Nói CÓ với cài đặt Mẫu CUDA
    • Nói KHÔNG xây dựng lại bất kỳ cấu hình Xserver nào với Nvidia
  7. Kiểm tra nếu /dev/nvidia*các tập tin tồn tại. Nếu họ không, hãy làm như sau

    sudo modprobe nvidia
    
  8. Đặt biến đường dẫn môi trường

    export PATH=/usr/local/cuda-7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
    
  9. Xác nhận phiên bản trình điều khiển

    cat /proc/driver/nvidia/version`
    
  10. Kiểm tra phiên bản trình điều khiển CUDA

    nvcc –V
    
  11. Bật lại lightdm

    sudo service lightdm start
    
  12. Ctrl+ Alt+ F7và đăng nhập vào hệ thống thông qua GUI

  13. Tạo mẫu CUDA, Chuyển đến NVIDIA_CUDA-7.5_Samplesthư mục qua thiết bị đầu cuối, sau đó chạy lệnh sau:

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

    Cả hai thử nghiệm cuối cùng sẽ xuất ra một 'PASS' trong thiết bị đầu cuối

  14. Khởi động lại hệ thống


Cảm ơn rất nhiều! Điều này cuối cùng cũng hoạt động trên Asus UX32VD (máy tính xách tay Optimus với GeForce 620M) của tôi. Tôi đã thử mọi thứ và mọi thứ. Hôm qua tôi có thể khiến nvidia-352 hoạt động với Bumblebee, nhưng sau khi cài đặt bộ công cụ CUDA, tôi không thể chạy bất kỳ mẫu nào (như thể tôi không có thẻ CUDA, và vâng, tôi đang sử dụng optirun). Các trình điều khiển khác sinh ra tôi vào các vòng đăng nhập hoặc màu đen unity-greeter! Tôi không thể cảm ơn đủ :))
Maghoumi 18/07/2016

Điều duy nhất mà tôi cần phải thay đổi ở đây là từ optionđể optionstrong phần nouveau danh sách đen.
TheM00s3

Tôi có máy tính để bàn HP với NVIDIA GeForce GTX 680. Hướng dẫn của bạn chủ yếu hoạt động, ngoại trừ trình điều khiển card đồ họa đi kèm với tệp chạy ( cuda_7.5.18_linux.run) khiến lightdmbạn ngừng hoạt động sau khi khởi động lại (sau khi grub, bạn sẽ thấy màn hình đen với con trỏ nhấp nháy vô tận ). Giải pháp của tôi là trước tiên gỡ cài đặt trình điều khiển đó sudo apt-get purge nvidia-*và cài đặt nó bằng tệp chạy mới nhất được tải xuống từ trang web chính thức của NVIDIA. Và nó hoạt động hoàn hảo. Một giải pháp thay thế sẽ là một cái gì đó giống như giải pháp (A) trong Askubfox.com/a/676772/194156
Xin

2

Có hai cách để cài đặt trình điều khiển CUDA phù hợp (cho Optimus và các chipset đồ họa tích hợp khác trên bo mạch chính lai) - cách đầu tiên được mô tả ở đây là dễ nhất và mô tả thứ hai cũng cồng kềnh hơn nhưng cũng hiệu quả:

A)

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

B)

Mô tả phương pháp B ở đây, nhưng đã cũ hơn (được giải thích bởi người dùng dschinn1001) - phương pháp B này khiêm tốn hơn và có thể rủi ro, nhưng không gây hại. :

Làm cách nào tôi có thể cài đặt Nvidia Driver GT 520 và Cuda 5.0 trong Ubuntu13.04?

Gói trình điều khiển beta để Nvidia tải xuống cho Linux có tại đây:

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

Phương pháp A đơn giản hơn, nhưng không rõ ràng, cách nó tương tác với xscreenaver và phương thức B cũ hơn, nhưng gói trình điều khiển cũng được cập nhật trong thời gian gần đây và sau khi phương thức B được thực hiện, nó sẽ hoạt động tốt hơn với xscreenaver có điều kiện là xscreenaver Cài đặt. (Tôi đã thử nghiệm phương pháp B vào ngày 13.10 và điều này đã hoạt động rất tốt, ngay cả với xscreenaver. Và tôi nghĩ phần còn lại của chuỗi này phụ thuộc vào phần cứng.)

Ngoài ra và liên quan đến ong nghệ với chipset đồ họa Optimus, những điều chỉnh này cho ong nghệ cũng rất cần thiết:

Cách thiết lập nVidia Optimus / Bumblebee trong 14.04


1

Âm thanh như lỗi lp 1428972 .

Người dùng fennytansy đã thêm một cách giải quyết trong nhận xét # 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


Sau khi tôi chạy màn hình lệnh trở thành màu đen. tôi chỉ có thể truy cập tty1? Bạn có biết giải pháp nào khác không?
Karesh Arunakirinathan

1

Tôi đã cài đặt thành công CUDA bằng phương thức runfile. Việc cài đặt khó hơn một chút vì trình điều khiển đồ họa chính của bạn cũng phải được cài đặt bằng phương thức runfile ( Xem tại đây ).

Hãy thử cài đặt chỉ người lái xe. Điều này có thể được thực hiện bằng cách sử dụng phương thức runfile. Nó sẽ nhắc bạn cho từng phần của quá trình cài đặt và bạn có thể vô hiệu hóa các GLthư viện và bộ công cụ. Trung tâm kiểm soát thống nhất đã và đang cung cấp cho tôi các vấn đề cũng như do nhu cầu sử dụng mẫu CUDA libGLU.sothay vì libGL.so. Đây là một sửa chữa dễ dàng khi xây dựng các ví dụ học tập của riêng bạn.


1

Hãy thử gỡ cài đặt trình điều khiển nvidia và trực tiếp cài đặt cuda mà không cần nó. Trên Ubuntu 14.04 mới, tôi đã làm theo hướng dẫn từ trang web của nvidia . Ngoài việc xác minh các phiên bản tương thích của mọi thứ (gcc, kernel), các hướng dẫn là:

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

Hạnh phúc, trình điều khiển nvidia chính xác đã được cài đặt như một sản phẩm phụ của các bước trên.


1

Tôi đã dành cả một ngày để tìm cách sử dụng " ppa: trình điều khiển đồ họa / ppa " để cập nhật trình điều khiển NVIDIA lên phiên bản 352. Mọi thứ đều thất bại. Sau một lần cài đặt, gpu-manager.log báo cáo rằng các trình điều khiển đã được cài đặt trong khi Xorg.0.log sẽ báo cáo ngược lại.

Trình điều khiển nouveau đã bị xóa và đưa vào danh sách đen: sudo apt-get --purge xóa xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf danh sách đen lbm-nouveau tắt

Cuối cùng tôi đã từ bỏ và sử dụng giải pháp hoàn toàn "NVIDIA ... bin".

  1. Danh sách đen nouveau, như được hiển thị ở trên.
  2. gỡ cài đặt hoàn toàn Xserver nouveau như được trích dẫn ở trên.
  3. Đặt bios hệ thống để có PCIe (hai thẻ nvidia) làm chính và hủy kích hoạt giao diện mainboard HD4600.
  4. khởi động vào chế độ phục hồi, kích hoạt mạng, sau đó chuyển sang chế độ console.
  5. Chạy "NVIDIA-Linux-x86_64-352.41.run -uninstall" chỉ để đảm bảo không còn gì.
  6. Đã xóa bất kỳ thư mục cũ nào trong / etc, / usr / local, trông giống như phần còn lại của các cài đặt cuda hoặc nvidia trong quá khứ.
  7. Chạy "NVIDIA-Linux-x86_64-352.41.run"
  8. Chạy "NVIDIA-Linux-x86_64-352.41.run --check" để xác minh rằng mọi thứ đều đúng (đúng như vậy).
  9. Sau đó chạy "cuda_7.5.18_linux.run" để hoàn tất cài đặt. Mọi thứ hiện đang làm việc. Cả hai màn hình đều hoạt động. Hiện đang làm việc để xây dựng các tập tin mẫu cuda. Hãy chắc chắn sử dụng các cờ "--help" trên các thùng cài đặt NVIDIA. Lý do chính khiến tôi quyết định đi theo lộ trình bin (cùng với một trong những giải pháp thay thế không hoạt động, là cách tiếp cận "bin" cung cấp một lộ trình dễ dàng để phục hồi sau khi cập nhật OpenGL "mesa". Kết quả

1

Tôi đã khởi động lại Ubuntu ngày hôm nay và thấy có một sự phụ thuộc chưa được đáp ứng khác giống như libcog15 : Depends: mesa-driver...(tôi không thể nhớ tên gói đầy đủ), vì vậy tôi đã sử dụngapt-get install để cài đặt "trình điều khiển mesa". Sau đó, CUDA 7.5 đã cài đặt thành công.

Lưu ý rằng phiên bản Kernel của tôi là 3.19.0-28-generic và phiên bản gcc là Ubuntu 4.8.4-2ubfox1 ~ 14.04 , không được tìm thấy trong các tài liệu chính thức của CUDA 7.5 . Tôi sẽ kiểm tra nếu nó thực sự hoạt động.


1
Vì một số lý do, trình điều khiển mesa trên máy tính của tôi đã gây ra tất cả các loại sự cố thống nhất khi khởi động và gây ra lỗi hoàn toàn cho hệ thống của tôi. Hãy cẩn thận.
asdf

@Bruce Yo - Điều này nói chung không chỉ là vấn đề của mesa, điều này phụ thuộc vào các chipset trên card đồ họa lai nvidia, tất cả đều khác nhau. Bạn nên xem xét giải pháp của tôi quá. : o)
dschinn1001

0

Tôi đã thử sudo su và apt-get install cuda thay vì sudo apt-get install cuda. Nó đã làm việc.

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

Chào mừng bạn đến hỏi Ubuntu, rất vui khi thấy bạn chia sẻ kiến ​​thức. Tuy nhiên, đây không phải là một diễn đàn, đây là trang web Hỏi & Đáp, hãy kiểm tra chuyến tham quan trợ giúp này . Sao chép câu trả lời của người khác (của 661266 người dùng) không giúp ích gì, bạn sẽ có thể bỏ phiếu khi bạn có đủ danh tiếng.
user.dz

@Sneetsher Cảm ơn bình luận của bạn. Tôi đã cố gắng trả lời 661266 của người dùng nhưng không được. Khi tôi sử dụng "su" thay vì "sudo", nó đã hoạt động. Tôi không biết tại sao chính xác. Tuy nhiên, nó đã làm việc với thử nghiệm của tôi. Tôi tin rằng nó có giá trị cho ai đó trong khi thử giải pháp của tôi.
softgearko

0

Vui lòng tham khảo: https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.md . Nó liên quan đến việc cài đặt Caffe về bản chất nhưng nó cũng giải quyết việc cài đặt CUDA.


1
Xin chào @amirsani_torfi, chào mừng bạn đến hỏi.ubfox. Lưu ý rằng trong khi liên kết của bạn có thể cung cấp thông tin cần thiết để giải quyết câu hỏi được hỏi, các liên kết có thể bị xóa bất cứ lúc nào. Tôi sẽ đề nghị bạn thay vì chỉnh sửa câu hỏi của bạn để bao gồm thông tin quan trọng từ liên kết đó.
Tshilidzi Mudau

-1

-Các biểu tượng với đăng nhập lightdm (vòng đăng nhập)

-Các biểu tượng với trình điều khiển istall ("Cài đặt trình điều khiển không thành công: có vẻ như máy chủ X đang chạy ...")

Để cài đặt thành công Bộ công cụ NVDA CUDA trên Ubuntu 16.04 64 bit tôi chỉ phải làm:

  1. tạo một hình ảnh trực tiếp của Ubuntu trên Pendrive (bút 8GB là đủ) - một lần thử như vậy sẽ tiết kiệm được rất nhiều dây thần kinh , trước khi cài đặt không thành công trên hệ thống Linux máy chủ của bạn !!!
  2. đăng nhập vào phiên trực tiếp trên Pendrive ("Hãy thử Ubuntu, trước khi cài đặt")
  3. thêm người dùng sudo tại phiên trực tiếp:

    quản trị viên sudo adduser (#pass: admin1)

    sudo usermod -aG sudo quản trị

  4. đăng xuất từ ​​phiên trực tiếp, đăng nhập với tên #admin

  5. tải xuống Bộ công cụ CUDA từ trang web chính thức của NVidia (~ 1,5 GB)
  6. thay đổi đặc quyền cho tệp trình cài đặt đã tải xuống (KHÔNG CÀI ĐẶT TẠI BƯỚC NÀY!):
    sudo chmod + x cuda_X.X.run

  7. chuyển sang giao diện điều khiển:

    Ctr + Alt + F1 (để bật chế độ xem thiết bị đầu cuối) Ctr + Alt + F7 (để chuyển từ chế độ xem thiết bị đầu cuối sang máy chủ đồ họa)

  8. tại giao diện điều khiển (Ctr + Alt + F1) đăng nhập:

    đăng nhập: quản trị viên vượt qua: admin1

  9. dừng dịch vụ chạy đồ họa:

    dịch vụ sudo dừng lightdm

  10. kiểm tra xem máy chủ đồ họa có tắt không - sau khi chuyển đổi Ctr + Alt + F7, màn hình sẽ có màu đen trống, chuyển trở lại trên giao diện điều khiển Ctr + Alt + F1

  11. cài đặt CUDA Toolkit, với cấu hình như vậy:

    sudo ./cuda_X.X.run (nhấn 'q' để bỏ qua đọc giấy phép) không cài đặt thư viện OpenGL không cập nhật cấu hình hệ thống X, các tùy chọn khác làm cho có và đường dẫn làm mặc định

  12. bật máy chủ đồ họa:

    dịch vụ sudo bắt đầu

  13. đăng nhập với tư cách người dùng (nếu bạn tự động đăng nhập với tư cách #ubfox khi đăng xuất phiên trực tiếp):

    đăng nhập: quản trị viên vượt qua: admin1

  14. kiểm tra mọi trình biên dịch nvcc hoạt động với tổng vectơ song song đơn giản được cung cấp tại Khối GPU:

    lưu vecSum.cu và book.h vào các tệp mới, biên dịch và chạy tại terminal: /usr/local/cuda-8.0/bin/nvcc vecSum.cu && xóa && ./a.out

  15. kiểm tra bản in giao diện điều khiển - nó sẽ tương tự như: 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. Nếu mọi thứ diễn ra tốt đẹp trên phiên trực tiếp, hãy làm tương tự trên hệ thống máy chủ linux của bạn

PS Xin lưu ý rằng nó không phải là hướng dẫn lý tưởng, nhưng hoạt động tốt với tôi!

======= 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;
}

========= cuốn sách.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__
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.