GPUSVM is a CUDA implementation of SVM which uses the SMO algorithm. This library supports two primary functionalities: training and classification.
The code is written in C++, and the source tar-ball contains an example of how to call performTraining() function once. My woe started when calling performTraining() more than once. This gave me a crash:
*** glibc detected *** bin/linux/release/svmTrain: double free or corruption (out): 0x000000000b6e4820 ***
This was apparently triggered by the second performTraining(). After some (ok, ok, 2 days including CUDA crash course actually) huntings, it turned out that there really are two invalid memory accesses:
- one is during memcpy-ing from device to host memory (occur in the second-order heuristic function);
- another is due to the absence of boundary check in a cache object, which leads to accessing a non-existing object;
in addition to a memory leak (alpha array in performTraining()).