If your running on newish hardware also make sure that you are setting the thread affinity mask to 1 in your startup code. You may be running into the multiprocessor issues related to timmers and processes.

Actually you should be doing this anyways, unless you are specifying the target processor for your timers. Another thing would be to do away with the locked FPS all together and make the application frame independent. Utilizing a rendering thread and a processing thread. You can then scale properly.

Thread afinity mask code:
[pascal] {$IFDEF WIN32}
SetThreadAffinityMask(GetCurrentThread(), 1);
{$ENDIF}
[/pascal]

Of final note, I've had problems with the SDL functions to get tick counts on some systems. To aliviate this I've created my own:
[pascal]function SystemGetTickCount : Cardinal;
begin
result := -1;
{$IFDEF WIN32}
result := Windows.GetTickCount();
{$ENDIF}
{$IFDEF UNIX}
result := clock_gettime(CLOCK_MONOTONIC);
{$ENDIF}
end;[/pascal]

Well, ok, I didn't create my own, but I did wrap up the *NIX and Windows default calls so that one call would work on either OS. From testing the usage doesn't change. Still need to do the Mac version, but damned if I can find the right calls.