【问题标题】:How to correctly assign double8 type如何正确分配 double8 类型
【发布时间】:2020-03-11 14:31:53
【问题描述】:

我正在尝试分配一个 double8 类型,最终用于使用 pyopencl 进行一些 AVX2 并行化。我正在编写代码以有效地在两个向量 va 和 vb 之间找到点积,并返回结果 vc。

代码如下:

# create context 
ctx = cl.create_some_context()
mf = cl.mem_flags

# define vectors to dot product 
va=np.array([1, 2, 3, 4, 5, 6, 7, 8],dtype=np.float32)
vb=np.array([1, 2, 3, 4, 5, 6, 7, 8],dtype=np.float32)

# create memory buffers for input vectors and output buffer
va_buf=cl.Buffer(ctx,mf.READ_ONLY|mf.COPY_HOST_PTR,hostbuf=va)
vb_buf=cl.Buffer(ctx,mf.READ_ONLY|mf.COPY_HOST_PTR,hostbuf=vb)
vc_buf=cl.Buffer(ctx,mf.WRITE_ONLY,vb.nbytes)

# define my kernel / C function that will perform dot product 
kernel="""
__kernel void adder(const __global float* va,
                const __global float* vb,
                __global float* vc
)
{
double8 v1 = (va[0],va[1],va[2],va[3],va[4],va[5],va[6],va[7]);
double8 v2 = (vb[0],vb[1],vb[2],vb[3],vb[4],vb[5],vb[6],vb[7]);

vc = v1.s0*v2.s0
    +v1.s1*v2.s1
    +v1.s2*v2.s2
    +v1.s3*v2.s3
    +v1.s4*v2.s4
    +v1.s5*v2.s5
    +v1.s6*v2.s6
    +v1.s7*v2.s7);
}

"""

# run the kernel 
adder=cl.Program(ctx,kernel).build().adder
event=adder(queue,va.shape,None,va_buf,vb_buf,vc_buf)
event.wait()

# create empty array an copy output buffer to it 
vd = np.zeros(va.shape)
cl.enqueue_copy(queue,vd,vc_buf)

我的错误是:

RuntimeError: clBuildProgram failed: BUILD_PROGRAM_FAILURE - clBuildProgram failed:         
BUILD_PROGRAM_FAILURE - clBuildProgram failed: BUILD_PROGRAM_FAILURE

Build on <pyopencl.Device 'pthread-Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz' on 'Portable Computing    Language' at 0x5594de2e3b60>:

error: /home/nbuser/.cache/pocl/kcache/tempfile-27-53-7c-c7-a0.cl:10:4: assigning to '__global float *' from incompatible type 'double'

【问题讨论】:

    标签: python c types opencl pyopencl


    【解决方案1】:

    我对 pyopencl 一无所知,但我认为内核与常规 OpenCL 内核完全一样。您的问题不在于 double8 类型的分配,而是值 vc 的分配。你有 vc 作为一个 __global float*,一个指针类型。看看您如何将 va 和 vb 视为数组并使用 [index] 访问它们的元素? vc也是如此。由于你的vc只打算存储一个值,你可以这样做

    vc[0] = ...

    或指针解引用

    *cv = ...

    所以你应该这样做:

    *vc = v1.s0*v2.s0
        +v1.s1*v2.s1
        +v1.s2*v2.s2
        +v1.s3*v2.s3
        +v1.s4*v2.s4
        +v1.s5*v2.s5
        +v1.s6*v2.s6
        +v1.s7*v2.s7);
    

    你可能想读一点 C/C++ 类型指针,OpenCL 指针基本相同,with some differences

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多