他のスレッドでは書き込めない超低レベルなチラ裏で恐縮ですが、
CUDA toolkitのサンプルのVecAddで、floatを全てdoubleに置き換えた上で
1.ベクトル要素数Nをどこまで大きくできるか
2.CPUによるVecAddとの速度差はどの程度か
を調べました。
※GPU=GTS450 1GB、CPU=AthlonII-X4 640@定格。CPUのVecAddは単純な3行ループで非マルチスレッド。

1.16*1000*1000までセーフ、17*1000*1000は実行時エラー(debug)。
つまりcudaMalloc()量にして384MBはセーフ、408MBはアウトでした(GTS450 1GB)。
VRAMいっぱいまで使えるわけではないのですね。

2.clock()による計測ですが、
GPU→トータル 437 clock(内訳:cudaMalloc(ABC)=250, cudaMemcpy(AとBをhost2dev)=125, VecAdd=0, Memcpy(Cをdev2host)=62)
CPU→172 clock
でした(debug。releaseでも比はだいたい同じ)。
最初は内訳を出さず437と172をみてガッカリしたのですが、内訳を見てマジスンマセンwでした。
メモリ確保・転送のオーバーヘッドがそれなりにあるということは、
「host関数から高速な関数としてdevice関数を(頻繁に)呼び出す」のではなく、
極力device関数内だけで処理をさせるようにしないとうまみが少ないのですね。