Forum > Alternate Hardware platforms

OSX Multibeam OpenCL question

<< < (11/14) > >>

Raistmer:
It's too high-level call again.
As I proposed earlier in this thread try to go inside that oclFFT API call, to the place where params of particular _kernel_ call are set. And add debug code there.

I'll post particular place when will be at my dev PC closer to evening today.

Raistmer:

--- Code: ---      //fprintf(stderr,"After getKernelWorkDimensions:\nbatchSize s =%d, gWorkItems =%d, lWorkItems =%d, dir =%d\n", s, gWorkItems, lWorkItems, dir);
err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj[currRead]);
err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj[currWrite]);
err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_int), &dir);
err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s);
#if USE_OPENCL_INTEL //R: only iGPU uses Taylor trig approx and LuT. Old Ati drivers can't accept NULL as valid buf
err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_mem), &(plan->cossin_LUT_d1));
            err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_mem), &(plan->cossin_LUT_d2));
#endif
err |= clEnqueueNDRangeKernel(queue,  kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL,NULL/*&fft_event*/);
if(err){
fprintf(stderr,"Error in mb oclFFT_1: %d\n",err);
return err;
}
#if OCL_VERBOSE
fprintf(stderr,"INFO: in mb oclFFT_1 ok\n");
#endif
--- End code ---

and


--- Code: ---        //fprintf(stderr,"After getKernelWorkDimensions:\nbatchSize s =%d, gWorkItems =%d, lWorkItems =%d, dir =%d\n", s, gWorkItems, lWorkItems, dir);
    err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj[currRead]);
    err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj[currWrite]);
    err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_int), &dir);
    err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s);
#if USE_OPENCL_INTEL //R: only iGPU uses Taylor trig approx and LuT. Old Ati drivers can't accept NULL as valid buf
err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_mem), &(plan->cossin_LUT_d1));
            err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_mem), &(plan->cossin_LUT_d2));
#endif
    err |= clEnqueueNDRangeKernel(queue,  kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL,NULL/*&fft_event*/);
if(err){
fprintf(stderr,"Error in mb oclFFT_2: %d\n",err);
return err;
}
#if OCL_VERBOSE
fprintf(stderr,"INFO: in mb oclFFT_2 ok\n");
#endif

--- End code ---

Joe Fox:
ah, ok. Sorry for the misunderstanding.

Joe Fox:
Finally got some time to trace down to the KernelArg that is throwing the error.

Here is the relevant code:
fft_execute.cpp line 583-603


--- Code: ---     getKernelWorkDimensions(plan, kernelInfo, &s, &gWorkItems, &lWorkItems);
        fprintf(stderr,"After getKernelWorkDimensions:\nbatchSize s =%d, gWorkItems =%lu, lWorkItems =%lu, dir =%d\n", s, gWorkItems, lWorkItems, dir);
    err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj[currRead]);
            fprintf(stderr, "after param 0: err=%d\n", err);
    err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj[currWrite]);
            fprintf(stderr, "after param 1: err=%d\n", err);
    err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_int), &dir);
            fprintf(stderr, "after param 2: err=%d\n", err);
    err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s);
            fprintf(stderr, "after param 3: err=%d\n", err);
            err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_mem), &(plan->cossin_LUT_d1));
            fprintf(stderr, "after param 4: err=%d\n", err);
            err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_mem), &(plan->cossin_LUT_d2));
            fprintf(stderr, "after param 5: err=%d\n", err);

    err |= clEnqueueNDRangeKernel(queue,  kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL,NULL/*&fft_event*/);
            fprintf(stderr, "after enqueue: err=%d\n", err);
if(err){
fprintf(stderr,"Error in mb oclFFT_2: %d\n",err);
return err;
}

--- End code ---

and the resulting output:

--- Code: ---INFO: oclFFT done no strip. plan_ptr: 0x7fff500f0060, FtfNum=0, fftlen=8, NumBlockFfts=131072, chirplen=1048576
After getKernelWorkDimensions:
batchSize s =131072, gWorkItems =131072, lWorkItems =64, dir =1
after param 0: err=0
after param 1: err=0
after param 2: err=0
after param 3: err=0
after param 4: err=-49
after param 5: err=-49
after enqueue: err=-49
Error in mb oclFFT_2: -49
ERROR: OpenCL kernel/call 'non-strip fft' call failed (-49) in file /Users/joe/projects/seti/sah_v7_opt/AKv8/client/analyzeFuncs.cpp near line 3823.

--- End code ---

So it looks like line 593

--- Code: ---            err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_mem), &(plan->cossin_LUT_d1));

--- End code ---
is the culprit.

This is all on svn revision 2760 which appears to be the latest.

And advice on next steps?

Raistmer:
The advise is quite simple

that's how really current code looks:


--- Quote ---          err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s);
#if USE_OPENCL_INTEL //R: only iGPU uses Taylor trig approx and LuT. Old Ati drivers can't accept NULL as valid buf
         err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_mem), &(plan->cossin_LUT_d1));
            err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_mem), &(plan->cossin_LUT_d2));
#endif
          err |= clEnqueueNDRangeKernel(queue,  kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL,NULL/*&fft_event*/);

--- End quote ---

So, do update to the latest revision and don't forget this time that SETI_opt source tree includes not only AKv8 directory but also src one that common between both MB and AP. Seems you use outdated src now.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version