安装了针对R的OpenCL包,但得到了奇怪的结果

安装了针对R的OpenCL包,但得到了奇怪的结果,r,opencl,R,Opencl,我在Linux系统上运行R3.4.3。因为我有一个Radeon(R9 380X)卡,所以我决定试试这个软件包(我知道有gpuR软件包,但它不适合我)。因此: 我确实安装了.packages('OpenCL','http://www.rforge.net/),如软件包页()上所建议,并获得了0.1-4版: Installing package into ‘/home/jeronimo/R/x86_64-pc-linux-gnu-library/3.4’ (as ‘lib’ is unspecifi

我在Linux系统上运行R3.4.3。因为我有一个Radeon(R9 380X)卡,所以我决定试试这个软件包(我知道有gpuR软件包,但它不适合我)。因此:

我确实安装了.packages('OpenCL','http://www.rforge.net/),如软件包页()上所建议,并获得了0.1-4版:

Installing package into ‘/home/jeronimo/R/x86_64-pc-linux-gnu-library/3.4’
(as ‘lib’ is unspecified)
trying URL 'http://www.rforge.net/src/contrib/OpenCL_0.1-4.tar.gz'
Content type 'application/x-gzip' length 14933 bytes (14 KB)
==================================================
downloaded 14 KB

* installing *source* package ‘OpenCL’ ...
** libs
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-3.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c ocl.c -o ocl.o
ocl.c: In function ‘ocl_call’:
ocl.c:440:5: warning: ‘clCreateCommandQueue’ is deprecated [-Wdeprecated-declarations]
     occ->commands = commands = clCreateCommandQueue(context, device_id, 0, &last_ocl_error);
     ^~~
In file included from /usr/include/CL/opencl.h:47:0,
                 from ocl.c:6:
/usr/include/CL/cl.h:1427:1: note: declared here
 clCreateCommandQueue(cl_context                     /* context */,
 ^~~~~~~~~~~~~~~~~~~~
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-3.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c tools.c -o tools.o
gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-z,relro -o OpenCL.so ocl.o tools.o -lOpenCL -L/usr/lib/R/lib -lR
installing to /home/jeronimo/R/x86_64-pc-linux-gnu-library/3.4/OpenCL/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (OpenCL)

The downloaded source packages are in
    ‘/tmp/user/1000/Rtmpkdhno7/downloaded_packages’
库似乎可以正确检测我的GPU:

> library(OpenCL)
> p = oclPlatforms()
> d = oclDevices(p[[1]])
> p
[[1]]
 OpenCL platform 'Clover'

[[2]]
 OpenCL platform 'Portable Computing Language'

> d
[[1]]
 OpenCL device 'AMD Radeon (TM) R9 380 Series (TONGA / DRM 3.19.0 / 4.14.0-3-amd64, LLVM 5.0.1)'
只是检查一下--它还检测多核CPU:

> oclDevices(p[[2]])
[[1]]
 OpenCL device 'pthread-AMD FX-8320E Eight-Core Processor'
现在,我创建了一个简单的OpenCL内核,它将得到一个向量,乘以-1,然后对其所有元素求和3.0:

code = c("
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
__kernel void countit(
      __global double* output,
      const unsigned int count,
      __global double* input) 
{
    int i = get_global_id(0);
    if (i<count)
            output[i] = -(input[i]) + (3.0);
};")

> f_kernel <- oclSimpleKernel(d[[1]], "countit", code, "double")
> 
> f<-function(ve)
+         oclRun(f_kernel,length(ve),ve, wait=TRUE)
>
但我希望这是向量
45678
,因为我在
1:5
中添加了3

以下是会话信息:

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C           
 [4] LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C        
[10] LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] devtools_1.13.1 OpenCL_0.1-4   

loaded via a namespace (and not attached):
[1] compiler_3.4.3 tools_3.4.3    withr_1.0.2    rstudioapi_0.6 memoise_1.1.0 
[6] digest_0.6.13 
我错过了什么?这看起来是我的一个简单错误,但我看不出来。
如果有任何提示,我将不胜感激

问题在于
1:5
属于
integer
类型。您必须将其转换为
数值
,才能将其作为
向量传入:

库(OpenCL)
p=oclPlatforms()
d=设备(p[[1]]
代码=c(“
#pragma OPENCL扩展cl_khr_fp64:启用
__核空计数(
__全球双*输出,
常量无符号整数计数,
__全局双精度输入){
int i=获取全局id(0);

如果(i)您的
输入
显示的不是零而是三。我不清楚问题出在哪里。
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C           
 [4] LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C        
[10] LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] devtools_1.13.1 OpenCL_0.1-4   

loaded via a namespace (and not attached):
[1] compiler_3.4.3 tools_3.4.3    withr_1.0.2    rstudioapi_0.6 memoise_1.1.0 
[6] digest_0.6.13