I doubt if the way the DDouble structure is passed to the kernel is correct. Its a structure type. You would have to pass it as a pointer either with __global or __constant (as its read only here).
Sorry, can't see your argument. From what I know about C language, there is no much difference between passing a built-in type and passing a type, defined with typedef. Neither I was able to find a place in OpenCL specification saying that I can't pass a structure as a private argument. Please correct me if I'm wrong. Also it somehow works for N <= 11.
Unfortunately, your code seems irrelevant to the issue, as the bug concerns private data integrity, not the ability to read from global memory.
I tried another experiment today. By changing the datatype of the private variable "tmp" declared inside the kernel from double to float, the sample works fine for N>11 too. So possibly the issue has to do with exceeding the private memory limit per work-item.That might be the reason why it works till N <=11 when "tmp" type is double. Anyway, I will try to get a clarification on this.