Speeding up my CAM
A while ago, I created from scratch a CAM software. It has been consistently working ok with a minor problem of occasional wounds in some parts, which I narrowed down to a bad condition.
But solving the math was only part of the problem. A problem my students found too difficult to crack. So I have to provide them a solution (this was for a ball end mill).
The computing time of the algorithm depends on how many calculations are done. And the brute-force approach of checking every single point, edge and triangle for each sample point is just too slow (but works flawlessly).
I have used a dual approach to speed up the code. On one hand, I am selecting only a few elements to be checked for each vertical scan line, that reduces significantly the number of checks to those that are relevant for the current scan line. The second idea is to write multi-threaded code that can handle different scan lines using a different thread, that in turn will run in a different core of the processor if I do not launch too many.
But what took me a while to realize is that I need to wait till all the threads are finished before closing files, otherwise I may miss some of the output data of the latest running threads.
Going from [brute-force case, single thread] 26 minutes to [selective checks, multithreaded 4 cores] 8 seconds was a significant improvement. My guess is that offloading code to the GPU could make it even faster, but so far I can live without that.
But solving the math was only part of the problem. A problem my students found too difficult to crack. So I have to provide them a solution (this was for a ball end mill).
The computing time of the algorithm depends on how many calculations are done. And the brute-force approach of checking every single point, edge and triangle for each sample point is just too slow (but works flawlessly).
I have used a dual approach to speed up the code. On one hand, I am selecting only a few elements to be checked for each vertical scan line, that reduces significantly the number of checks to those that are relevant for the current scan line. The second idea is to write multi-threaded code that can handle different scan lines using a different thread, that in turn will run in a different core of the processor if I do not launch too many.
But what took me a while to realize is that I need to wait till all the threads are finished before closing files, otherwise I may miss some of the output data of the latest running threads.
Going from [brute-force case, single thread] 26 minutes to [selective checks, multithreaded 4 cores] 8 seconds was a significant improvement. My guess is that offloading code to the GPU could make it even faster, but so far I can live without that.
Comments
Regards
Peter van der Walt