This is mostly right.  GPUs suffer when the problem does not easily map to array-oriented computations, where the arrays have hundreds of elements corresponding to the hundreds of compute threads available to a GPU.  They are also more challenging to program, and code performance is sensitive to the specific GPU architecture used.