如果使用CL_MEM_USE_HOST_PTR将变量传递给内核,是否意味着设备中变量的任何更改也会显示在主机内存中?
我在使用CPU作为设备而不是GPU的情况下,因此传递给内核的所有内容都将标记为CL_MEM_USE_HOST_PTR.
如果这是真的,那么我不再需要将所有内容都读回主机,这非常方便.
我正在编写一个OpenCL内核,它在循环中涉及一些障碍.我已经在CPU(8核FX8150)上测试了内核,结果显示这些障碍将运行速度降低了50到100倍(我通过使用多线程+ CyclicBarrier在Java上重新实现内核进一步验证了这一点) .我怀疑原因是屏障基本上阻止了CPU利用无序执行,所以如果我在GPU上观察到相同幅度的速度降低,我有点担心.我检查了一些官方文档并搜索了一下,但是关于这个主题的信息很少.
如果我这样做:
x=[(t,some_very_complex_computation(y)) for t in z]
Run Code Online (Sandbox Code Playgroud)
显然some_very_complex_computation(y)不依赖于t.所以它应该只评估一次.有没有办法让Python意识到这一点,所以它不会为每次迭代评估some_very_complex_computation(y)?
编辑:我真的想在一行中做到这一点......
我需要一个OpenCL内核程序中最小/最大的浮点数,它涉及计算日志概率.我看了一下OpenCL参考手册,但我找不到这样的常量.
在Java中,它等同于Double.MAX_VALUE;
在C中它位于float.h中
最好的方法是什么?
我尝试了以下方法:
ByteBuffer cacheBuffer=ByteBuffer.allocateDirect(nm(nLimit,0)); //where nm(nLimit,0) is a large number
double[] cache=cacheBuffer.asDoubleBuffer().array();
Run Code Online (Sandbox Code Playgroud)
但我得到了这个例外:
java.lang.UnsupportedOperationException
at java.nio.DoubleBuffer.array(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
为什么?
编辑:
它看起来像javadoc"返回支持此缓冲区的双数组(可选操作)." 实际上意味着array()方法只是返回已经支持此缓冲区的double数组.我以为它会以某种方式将缓冲区转换为double [].所以现在我有一个例外是有意义的.
我会用一种简单的方法(最好是一行)来重塑列表
[1,2,3,4,5,6,7,8,9,10,"prime"]
Run Code Online (Sandbox Code Playgroud)
进入
[[1,2],[3,4],[5,6],[7,8],[9,10],["prime"]]
Run Code Online (Sandbox Code Playgroud)
或者
[[1,2,3],[4,5,6],[7,8,9],[10,"prime"]]
Run Code Online (Sandbox Code Playgroud)
或者
[[1,2,3,4],[5,6,7,8],[9,10,"prime"]]
Run Code Online (Sandbox Code Playgroud)
...
因为我传递了不同的参数(上面的例子是 2,3,4)。
numpy.reshape 不能这样做,因为列表的长度不能被 2,3,4 整除。