是否有任何研究比较OpenCL和OpenMP性能?具体来说,我感兴趣的是使用OpenCL启动线程的开销,例如,如果要将域分解为大量单个工作项(每个工作项由一个执行小工作的线程运行),而不是OpenMP中的较重权重线程.域被分解为子域,其数量等于核心数.
似乎OpenCL编程模型更多地针对大规模并行芯片(例如GPU),而不是具有更少但更强大的内核的CPU.
OpenCL可以成为OpenMP的有效替代品吗?
我有一个numpy一维数组c,应该填充内容
a + b.我首先a + b在使用的设备上执行PyOpenCL.
我想c使用numpy切片快速确定python中结果数组的正确性.
这就是我现在拥有的
def python_kernel(a, b, c):
temp = a + b
if temp[:] != c[:]:
print "Error"
else:
print "Success!"
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all()
但似乎a.any或a.all将只确定值是否不为0.
我应该怎么做,如果我想测试,如果所有的缩放器numpy阵列temp都等于在每个值numpy阵列c?
OpenCL仅允许使用C99规范访问单维数组.然而我的问题是二维的,我在主机端使用二维数组
我不想通过计算索引使我的代码可读性降低,而是想使用C宏来获取元素A[i][j].不幸的是,我在这方面做得很差,而且对C的经验也不多.我想我对如何做到这一点有了一般的想法,但如果有人可以批评,我将不胜感激.
它会是这样的:
#define 2d_access(u, y, x) (u[y][x])
Run Code Online (Sandbox Code Playgroud)
其中u是矩阵,y是行,x是列,宏将返回值 u[y][x]
矩阵是静态分配的,因此宏将具有WIDTH组件.
#define 2d_access(u, y, x) (u[y * WIDTH] + x])
Run Code Online (Sandbox Code Playgroud)