Tôi đang làm việc trên tiny R package sử dụng CUDA và Rcpp, được điều chỉnh từ đầu ra của Rcpp.package.skeleton()
. Trước tiên tôi sẽ mô tả những gì xảy ra trên nhánh chính cho cam kết mang tên "không gian tên cố định". Gói cài đặt thành công nếu tôi quên CUDA (tức là, nếu tôi xóa tệp src/Makefile, hãy thay đổi src/rcppcuda.cu thành src/rcppcuda.cpp và nhận xét mã xác định và gọi các hạt nhân). Nhưng như vậy, trình biên dịch không thành công.Xây dựng một gói R nhỏ với CUDA và Rcpp
Tôi cũng muốn biết cách biên dịch với Makevars hoặc Makevars.in thay vì Makefile và nói chung, hãy cố gắng làm cho nền tảng này độc lập như thực tế. Tôi đã đọc về Makevars trong R extensions manual, nhưng tôi vẫn chưa thể làm cho nó hoạt động.
Một số bạn có thể đề xuất rCUDA
, nhưng những gì tôi thực sự ở đây đang cải thiện một gói lớn mà tôi đã phát triển trong một thời gian và tôi không chắc chắn rằng việc chuyển đổi có giá trị bắt đầu lại từ đầu.
Dù sao, đây là những gì sẽ xảy ra khi tôi thực hiện R CMD build
và R CMD INSTALL
trên this one (nhánh chính, cam kết mang tên "không gian tên cố định").
* installing to library ‘/home/landau/.R/library’
* installing *source* package ‘rcppcuda’ ...
** libs
** arch -
/usr/local/cuda/bin/nvcc -c rcppcuda.cu -o rcppcuda.o --shared -Xcompiler "-fPIC" -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -I/apps/R-3.2.0/include -I/usr/local/cuda/include
rcppcuda.cu:1:18: error: Rcpp.h: No such file or directory
make: *** [rcppcuda.o] Error 1
ERROR: compilation failed for package ‘rcppcuda’
* removing ‘/home/landau/.R/library/rcppcuda’
... thật lạ, bởi vì tôi bao gồm Rcpp.h và Rcpp được cài đặt.
$ R
R version 3.2.0 (2015-04-16) -- "Full of Ingredients"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-unknown-linux-gnu (64-bit)
...
> library(Rcpp)
> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Rcpp_0.11.6
>
Tôi đang sử dụng CentOS,
$ cat /etc/*-release
CentOS release 6.6 (Final)
LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
CentOS release 6.6 (Final)
CentOS release 6.6 (Final)
CUDA phiên bản 6,
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Thu_Mar_13_11:58:58_PDT_2014
Cuda compilation tools, release 6.0, V6.0.1
và tôi có quyền truy cập đến 4 GPU của cùng làm và mô hình.
$ /usr/local/cuda/samples/bin/x86_64/linux/release/deviceQuery
/usr/local/cuda/samples/bin/x86_64/linux/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 4 CUDA Capable device(s)
Device 0: "Tesla M2070"
CUDA Driver Version/Runtime Version 6.0/6.0
CUDA Capability Major/Minor version number: 2.0
Total amount of global memory: 5375 MBytes (5636554752 bytes)
(14) Multiprocessors, (32) CUDA Cores/MP: 448 CUDA Cores
GPU Clock rate: 1147 MHz (1.15 GHz)
Memory Clock rate: 1566 Mhz
Memory Bus Width: 384-bit
L2 Cache Size: 786432 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65535), 3D=(2048, 2048, 2048)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 32768
Warp size: 32
Maximum number of threads per multiprocessor: 1536
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (65535, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Enabled
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID/PCI location ID: 11/0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
...
> Peer access from Tesla M2070 (GPU0) -> Tesla M2070 (GPU1) : Yes
> Peer access from Tesla M2070 (GPU0) -> Tesla M2070 (GPU2) : Yes
> Peer access from Tesla M2070 (GPU0) -> Tesla M2070 (GPU3) : Yes
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU1) : No
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU2) : Yes
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU3) : Yes
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU1) : Yes
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU2) : No
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU3) : Yes
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU0) : Yes
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU1) : No
> Peer access from Tesla M2070 (GPU1) -> Tesla M2070 (GPU2) : Yes
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU0) : Yes
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU1) : Yes
> Peer access from Tesla M2070 (GPU2) -> Tesla M2070 (GPU2) : No
> Peer access from Tesla M2070 (GPU3) -> Tesla M2070 (GPU0) : Yes
> Peer access from Tesla M2070 (GPU3) -> Tesla M2070 (GPU1) : Yes
> Peer access from Tesla M2070 (GPU3) -> Tesla M2070 (GPU2) : Yes
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.0, CUDA Runtime Version = 6.0, NumDevs = 4, Device0 = Tesla M2070, Device1 = Tesla M2070, Device2 = Tesla M2070, Device3 = Tesla M2070
Result = PASS
Edit: nó biên dịch cho bất kỳ cam kết sau khi "namespace cố định" ở hai chi nhánh, nhưng vẫn còn có những vấn đề với cách kết hợp Rcpp và CUDA
Để biên soạn gói, hóa ra tôi chỉ cần tách mã C++ và CUDA của mình thành riêng biệt *.cpp
và *.cu
tệp. Tuy nhiên, khi tôi thử "biên soạn cpp và Cu riêng" cam kết về chi nhánh tổng thể, tôi nhận được
> library(rcppcuda)
> hello()
An object of class "MyClass"
Slot "x":
[1] 1 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 2 3 4 5 6 7 8 9 10
Error in .Call("someCPPcode", r) :
"someCPPcode" not resolved from current namespace (rcppcuda)
>
Các lỗi sẽ biến mất trong ngành withoutCUDA
trong cam kết mang tên "thêm chi nhánh withoutCUDA".
> library(rcppcuda)
> hello()
An object of class "MyClass"
Slot "x":
[1] 1 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 2 3 4 5 6 7 8 9 10
[1] "Object changed."
An object of class "MyClass"
Slot "x":
[1] 500 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 1000 3 4 5 6 7 8 9 10
>
Sự khác biệt duy nhất giữa "biên soạn cpp và Cu riêng" cam kết trên master
và "thêm chi nhánh withoutCUDA" cam kết trên withoutCUDA
là
- Các Makefile và someCUDAcode.cu đã mất hết từ
withoutCUDA
. - Trong
withoutCUDA
, tất cả các tham chiếu đếnsomeCUDAcode()
đều biến mất khỏi someCPPcode.cpp.
Ngoài ra, sẽ vẫn thuận tiện khi có thể sử dụng CUDA và Rcpp trong cùng một tệp *.cu
. Tôi thực sự muốn biết cách sửa lỗi "không gian tên cố định" cam kết trên nhánh chính.
Điều này giải quyết cả hai vấn đề sau: sử dụng Makevars một cách chính xác và sử dụng Rcpp với CUDA. Cảm ơn! – landau
Vui mừng được trợ giúp :-) – cdeterman
Tôi nên đề cập đến việc thực hiện các thay đổi để cho phép 'someCPPcode (r)' thay vì '.Call ('someCPPcode', r)' không hoạt động đối với tôi. Tôi không thể truy cập chức năng 'someCPPcode' trong R. – landau