0

次のカーネル関数があります。

   private static String programSource =
        "__kernel void sampleKernel(__global float *Y, __global  float *param) "
        + "{ int index = get_global_id(0); "
        + "  Y[index]=param[0]-Y[index]/param[1]-param[2]; "
        + "} ";

最初の引数「Y」は完全に機能しますが、2番目のパラメーター「param」は正しく機能しません。null値を受け取ります。2番目のパラメーターは配列である必要があり、3つのセルで構成されます。

送信パラメータを含むコードのフラグメント:

        float[] arr_params = new float[3];
        arr_params[0] = (float) h_c;
        arr_params[1] = (float) sy;
        arr_params[2] = (float) dy;

        //pointers
        Pointer Pvy = Pointer.to(vy);
        Pointer Parr_params = Pointer.to(arr_params);

        cl_mem memObjects[] = new cl_mem[2];

        memObjects[0] = clCreateBuffer(context,
                CL_MEM_READ_WRITE,
                Sizeof.cl_float * vy.length, Pvy, null);
        memObjects[1] = clCreateBuffer(context,
                CL_MEM_READ_ONLY,
                Sizeof.cl_float * arr_params.length, Parr_params, null);

        // Set the arguments for the kernel
        clSetKernelArg(kernel, 0,
                Sizeof.cl_mem, Pointer.to(memObjects[0]));
        clSetKernelArg(kernel, 1,
                Sizeof.cl_mem, Pointer.to(memObjects[1]));

        // Set the work-item dimensions
        long global_work_size[] = new long[]{vy.length};
        long local_work_size[] = new long[]{1};

        // Execute the kernel
        clEnqueueNDRangeKernel(commandQueue, kernel, 1, null,
                global_work_size, local_work_size, 0, null, null);

        // Read the output data
        clEnqueueReadBuffer(commandQueue, memObjects[0], CL_TRUE, 0, vy.length * Sizeof.cl_float, Pvy, 0, null, null);
        // Release kernel, program, and memory objects
        clReleaseMemObject(memObjects[0]);
        clReleaseMemObject(memObjects[1]);
4

1 に答える 1

2

clCreateBuffer呼び出しで、データの取得先をOpenCLに指示していないため、2番目のバッファーはすべてゼロです。CL_MEM_USE_HOST_PTRまたはCL_MEM_COPY_HOST_PTRを使用します。

于 2012-04-09T21:41:49.097 に答える