[Beignet] Bug in fmod
Zhigang Gong
zhigang.gong at linux.intel.com
Mon Feb 9 16:42:25 PST 2015
Hi Pavan,
Could you run all of your test cases with the strict conformance mode as below?
OCL_STRICT_CONFORMANCE=1 ./test_cases
Thanks,
Zhigang Gong.
On Mon, Feb 09, 2015 at 06:38:32PM -0500, Pavan Yalamanchili wrote:
> Hi Everyone,
>
> We have recently began testing our library (
> https://github.com/arrayfire/arrayfire) with Beignet. About 10 of our 44
> tests are failing for this architecture. I am trying to narrow down the
> cause of all the issues.
>
> Today I was able to narrow down the first, simplest issue. I am attaching a
> stand alone file that should reproduce the problem. The output of "fmod"
> seems to be incorrect for atleast some values.
>
> System information:
>
> Device: Intel(R) HD Graphics IvyBridge GT2
> Beignet version: Release_v1.0.0
> Linux Kernel: 3.18.4-1-ARCH
>
>
> The source code to reproduce the problem is attached below. Let me know if
> further information is needed from my end.
>
> --
> Pavan
> #include <stdio.h>
> #include <CL/cl.h>
> #include <math.h>
>
> #define CL_CHECK(fn) do { \
> cl_int _err = fn; \
> if (_err == CL_SUCCESS) break; \
> printf("%s(%d) OpenCL Error: %d\n", \
> __FILE__, __LINE__, _err); \
> return _err; \
> } while (0) \
>
> const char fmod_ker_str[] = ""
> "__kernel\n"
> "void fmod_ker(__global const float * const lhs,\n"
> "float rhs,\n"
> "__global float * const out) {\n"
> "unsigned idx = get_global_id(0);\n"
> "out[idx] = fmod(lhs[idx], rhs);\n"
> "}\n";
>
>
> int main(int argc, char **args)
> {
> int pid = argc < 2 ? 0 : atoi(args[1]);
> int did = argc < 3 ? 0 : atoi(args[2]);
>
> unsigned num_platforms = 0;
> CL_CHECK(clGetPlatformIDs(0, NULL, &num_platforms));
> if (num_platforms <= pid) {
> printf("Invalid Platform ID\n");
> return -pid;
> }
>
> cl_platform_id *platforms = (cl_platform_id *)malloc(num_platforms * sizeof(cl_platform_id));
> CL_CHECK(clGetPlatformIDs(num_platforms, platforms, NULL));
> cl_platform_id platform = platforms[pid];
>
> unsigned num_devices = 0;
> CL_CHECK(clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 0, NULL, &num_devices));
> if (num_devices <= did) {
> printf("Invalid Device ID\n");
> return -did;
> }
>
> cl_device_id *devices = (cl_device_id *)malloc(num_devices * sizeof(cl_device_id));
> CL_CHECK(clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, num_devices, devices, NULL));
> cl_device_id device = devices[did];
>
> char platform_name[64];
> char device_name[256];
>
> CL_CHECK(clGetPlatformInfo(platform,
> CL_PLATFORM_NAME,
> sizeof(platform_name), &platform_name,
> NULL));
>
>
> CL_CHECK(clGetDeviceInfo(device,
> CL_DEVICE_NAME,
> sizeof(device_name), &device_name,
> NULL));
>
> printf("Platform: %s\n", platform_name);
> printf("Device: %s\n", device_name);
> printf("Kernel String:\n%s\n", fmod_ker_str);
>
> cl_context_properties cps[3] = {CL_CONTEXT_PLATFORM,
> (cl_context_properties)(platform),
> 0};
>
> cl_int err;
> cl_context ctx = clCreateContext(cps, 1, &device, NULL, NULL, &err);
> CL_CHECK(err);
>
> cl_command_queue queue = clCreateCommandQueue(ctx, device, 0, &err);
> CL_CHECK(err);
>
> const int elements = 256;
> int bytes = elements * sizeof(float);
> float *h_in = (float *)malloc(bytes);
> float *h_out = (float *)malloc(bytes);
>
> for (int i = 0; i < elements; i++) {
> h_in[i] = 3.0;
> h_out[i] = 0.3; //10101;
> }
>
> cl_mem b_in = clCreateBuffer(ctx, CL_MEM_READ_WRITE, bytes, NULL, &err);
> CL_CHECK(err);
> CL_CHECK(clEnqueueWriteBuffer(queue, b_in, true, 0, bytes, h_in, 0, NULL, NULL));
>
> cl_mem b_out = clCreateBuffer(ctx, CL_MEM_READ_WRITE, bytes, NULL, &err);
> CL_CHECK(err);
>
> float val = 0.3;
>
> size_t local = elements;
> size_t global = elements;
>
> const char *ker_sources[] = {fmod_ker_str, NULL};
> const size_t ker_lens[] = { sizeof(fmod_ker_str), 0 };
> cl_program program = clCreateProgramWithSource(ctx, 1, ker_sources,
> ker_lens, &err);
> CL_CHECK(err);
> CL_CHECK(clBuildProgram(program, 0, NULL, "", NULL, NULL));
>
> cl_kernel kernel = clCreateKernel(program, "fmod_ker", &err);
> CL_CHECK(err);
>
> CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &b_in ));
> CL_CHECK(clSetKernelArg(kernel, 1, sizeof(float ), &val ));
> CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &b_out));
>
> CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL));
> CL_CHECK(clFlush(queue));
> CL_CHECK(clFinish(queue));
>
> CL_CHECK(clEnqueueReadBuffer(queue, b_out, true, 0, bytes, h_out, 0, NULL, NULL));
>
> for (int i = 0; i < 10; i++) {
> printf("Expected: %f, Calculated: %f\n", fmodf(h_in[i], val), h_out[i]);
> }
>
> free(platforms);
> free(devices);
> free(h_in);
> free(h_out);
> }
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list