Development Logs

Community Bonding Period

  • Compiled working version of BRL-CAD with OpenCL on Ubuntu 18.04
  • Got familiarised with the MGED commands and the sequence of code being called from the build
  • Checked out other primitives which have been parallelized and their structure

Weekly update

  • Week - 1 (June 1 - June 5)
    • June 1: Working on getting ARBN primitive parallelized via OpenCL
    • June 6: Submitted patch for review (June 6)
  • Week - 2 (June 8 - June 12)
    • June 8: Working on getting PIPE primitive parallelized via OpenCL
    • June 9: Worked on discont_radius_shot() function
    • June 10: Worked on bend_pipe_shot() function
    • June 12: Worked on linear_pipe_shot() function
  • Week - 3 (June 15 - June 19)
    • June 15: Worked on pipe_start_shot() and pipe_end_shot() function
    • June 17: Assembled all in pipe_shot() function
    • June 19: Fixed a few bugs in pipe_shot() file
  • Week - 4 (June 22 - June 26)
    • June 22: Submitted the PIPE patch file in sourceforge
    • June 23: Started working on Dispalcement Map primitive
    • June 24: Worked on dsp_in_rpp() function
    • June 26: Worked on recurse_dsp_bb() function
  • Week - 5 (June 29 - July 03)
    • June 29: Got stuck in recurse_dsp_bb() function
    • July 1: First Evaluation Feedback

// Kept DSP primitive on hold owing to it's complex structure. Once I get used to the simple primitives, I'll be in a better position to work on DSP primitive. Hence, have kept it for the last month.

    • July 3 : Started working on Volume primitive
  • Week - 6 (July 6 - July 10)
    • July 6: Completed rt_vol_shot() and rt_vol_norm() function
    • July 8: Resolved few bugs
    • July 9 - 10: Took a break for travelling to hometown owing to Covid-19
  • Week - 7 (July 13 - July 17)
    • July 13: Submitted patch for Volume primitive
    • July 14: Started working on Metaball primitive
    • July 15: Converted secondary function: rt_metaball_point_value_iso()
    • July 16: Converted secondary function: rt_metaball_find_intersection()
    • July 17: Implemented rt_metaball_shot() in file
  • Week - 8
    • July 20: Completed rt_metaball_norm() function. Read about the inline functions being used here and it's possible counterpart and usage in OpenCL. I think I'll merge rt_metaball_norm_internal() into the norm method.
    • July 21: Seems like there were two versions of the algorithm, only one of which was being used. Have removed the old version code from file to remove redundancy.
    • July 22: Submitted metaball primitive here: . I made a typo mistake while developing a patch, I've resubmitted it. Use the latest patch in comments section. Onto EBM primitive now!
    • July 23: The -z flag worked FINALLY! I though of giving it a try once again today and it worked. I'd to change the FindOpenCL.cmake file locally to ensure it catches the correct path of OpenCL directory. This has indeed solved a big problem of mine. I'll revisit the previous patches now and update them accordingly. Will also include a detailed documentation of the commands and resolution of the errors I faced for future reference soon.
    • July 24: Submitted patch for FindOpenCL.cmake file here: . Debugged the ARBN primitive patch files to remove the compile-time errors and typos! Moved on to VOL primitive, couldn't find relevant rendering command.
  • Week - 9
    • July 27: Debugging METABALL primitive. Looking into plausible ways of passing extra parameters r_min and r_max from metaball_shot() to its declaration.
    • July 28: While compiling previously converted primitives like ELL and ARB8, I got compilation error - "failed to set OpenCL kernel arguments". On running the code, I found a bug in master branch itself. There was a mismatch between uchar2 and uchar3 in clt_frame() function in primitve_util.c and all it's related functions. I've updated the code, will include a patch for this. All primitives are rendering successfully now! Yayyyy!
    • July 29: Submitted patch for the above bug resovled here: . Moving on to removing errors in PIPE primitive. Most of the compile time errors were related to Global-Private conversion, hence made all struct inside functions global as well. It is now compiling error-free but not rendering. Gotta deep dive more!
    • July 30: Looking for possible options to print inside OpenCL kernel to see where it might be failing. Can't find any previously converted primitive with bu_log in it. Maybe, I'll import bu.h and give it a try!
    • July 31: Worked out communication issues with Sean and came up with a measurable criteria going forward. Going to be chatting progress a lot more going forward in Zulip! Also, documented the details of issues I faced in Dev Logs for future reference. With this evaluation, the second month of the GSoC comes to an end. Onto the final phase now!
  • Week 10
    • August 3: Took a break, will make it up for it on Saturday!
    • August 4: While checking CLINE primitive patch for debugging, I found it's shot function was missing. That being my first patch, I might have missed out on doing "svn add" of that file. Will have to redo again.
    • August 5: Completed the cline primitive conversion, looking for documentation for making this in MGED window so that I can render and test if it is working as expected. Couldn't find any proper documentation for this!
    • August 6: Trying to see best practice to import/define bn_distsq_line3_line3() in the OpenCL version of this from libbn repository.
    • August 7: Defined the bn_distsq_line3_line3() in and used it in . It is now compiling error-free. Tried using printf command, but the rendering gets stuck somehow because of it. Gotta deep dive more!

Major Issues Faced

Issue 1

    • Issue: -Z flag not working. Initially, I couldn't find proper documentation around -z flag and it's usage. I only found with command man rt that -z is used to compile with OpenCL function of that primitive. However, it always said printed "Raytrace Aborted" in the logs.
    • Solution: I found that while doing the cmake compiling, it couldn't find the OpenCL library and it's version correctly. It detected library path as "/usr/" instead of the usual "/usr/lib/x86_64-linux-gnu/" . So, I changed the cmake file where it detected OpenCL and submitted patch for FindOpenCL.cmake file here: . The commands are now as follows:

While doing the cmake, add the DBRLCAD_ENABLE_OPENCL flag

cd brlcad-svn-trunk
mkdir build
cd build

While compiling a primitive in mged window, use the following command:

 rt -z 1 -o primitive_cl.png 

If you pass 0 to the -z flag, it'll compile the C version of the primitive. So to say, passing 1 to -z flag defines the USE_OPENCL flag inside primitive function to 1. -o flag outputs the primitive rendering to an external file in the build folder.

Issue 2

    • Issue: Primitives already present in the master branch of the repository were not rendering in their OpenCL version. It displayed error: "failed to set OpenCL kernel arguments".
    • Solution: I found that the error was due to a mismatch between uchar2 and uchar3 data type of variable "o" in clt_frame() functions in primitive_util.c file. I made the variable uniform to uchar3 in all the places where this function was being used and they're now rendering as usual. The patch was submitted at the link here: .