cudaDeviceSynchronizeはこんなときに使う. Ki=1024, Mi = Ki*Ki, Gi = Ki*Miとでもして
__global__ void
cuda_main(){
 double *idata = new [Mi];  double *odata1 = new [Mi];  double *odata2 = new [Mi];

 body1<<< Ki, Ki >>> ( idata, odata1 ); //マルチスレッド実体
 cudaDeviceSynchronize();
 body2<<< Ki, Ki >>> ( odata1, odara2 ); //マルチスレッド実体
 cudaDeviceSynchronize(); 
 for( int i = 0; i < Mi; i++ ){
  cudaDeviceSynchronize(); // *** こいつは毎回要ったと思う
  printf(" %d %e\n", i, odata2[i]); //計算結果表示
 }
 cudaDeviceSynchronize(); // 上の***だけで こいつはなくても構わなかったと思う

 delete[] odata2;  delete[] odata1;  delete[] idata;
}

main(){
 //cuda 内newで確保するメモリが8MBを超える場合は設定要
 cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t(Gi + Gi));
 //printf fifoを16Miにしてみた
 cudaDeviceSetLimit(cudaLimitPrintfFifoSize, 16 * Mi); 
 
 cuda_main<<<1、1>>>();
}