Erstellen eines winzigen R-Pakets mit CUDA und Rcpp
Ich arbeite an einemtiny R package, das CUDA und Rcpp verwendet, angepasst aus der Ausgabe vonRcpp.package.skeleton()
. Ich werde zunächst beschreiben, was in der Master-Verzweigung für das Commit mit dem Titel "Fixed Namespace" passiert. Das Paket wird erfolgreich installiert, wenn ich CUDA vergesse (d. H. Wenn ich src / Makefile entferne, src / rcppcuda.cu in src / rcppcuda.cpp ändere und den Code auskommentiere, der den Kernel definiert und aufruft). Aber wie es ist, schlägt die Kompilierung fehl.
Ich würde auch gerne wissen, wie man mit einem Makevars oder Makevars.in anstelle eines Makefiles kompiliert, und im Allgemeinen versuchen, dies so plattformunabhängig wie möglich zu machen. Ich habe über Makevars im @ gelesR Erweiterungshandbuch, aber ich konnte es immer noch nicht zum Laufen bringen.
Einige von Ihnen können vorschlagen,rCUDA
, aber ich bin wirklich hinterher dran, ein großes Paket zu verbessern, das ich bereits seit einiger Zeit entwickle, und ich bin mir nicht sicher, ob es sich lohnt, von vorne zu beginnen.
Anyway, hier ist was passiert wenn ich ein @ macR CMD build
undR CMD INSTALL
aufdiese (Hauptzweig, Festschreiben mit dem Titel "fester Namespace").
* 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’
... was seltsam ist, weil ich Rcpp.h einbinde und Rcpp installiert ist.
$ 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
>
Ich benutze 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 Version 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
und ich habe Zugriff auf 4 GPUs desselben Herstellers und Modells.
$ /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: Kompiliert für alle Festschreibungen nach "festem Namespace" in beiden Zweigen, aber es gibt immer noch Probleme beim Kombinieren von Rcpp und CUDA
Um das Paket kompilieren zu können, stellte sich heraus, dass ich nur meinen C ++ - und CUDA-Code in ein separates @ trennen musst*.cpp
und*.cu
Dateien. Wenn ich jedoch versuche, "cpp und cu getrennt kompilieren" für den Master-Zweig zu übernehmen, erhalte ich
> 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)
>
Der Fehler geht im @ wwithoutCUDA
Branch im Commit mit dem Titel "Adding Branch 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
>
Die einzigen Unterschiede zwischen "Kompilieren von cpp und cu separat" werden auf @ festgeschriebemaster
und der "Adding Branch withoutCUDA" Commit aufwithoutCUDA
sin
withoutCUDA
.ImwithoutCUDA
, alle Verweise aufsomeCUDAcode()
sind von someCPPcode.cpp verschwunden.Auch wäre es immer noch praktisch, CUDA und Rcpp im selben @ zu verwend*.cu
Datei. Ich würde wirklich gerne wissen, wie das Festschreiben des "festen Namespace" für den Master-Zweig behoben werden kann.