一度だけ使用cudaMemcpy()して、正確に1GBのデータをデバイスにコピーします。これには5.9秒かかります。逆に、5.1秒かかります。これは正常ですか?
関数自体には、コピーする前に非常に多くのオーバーヘッドがありますか?理論的には、PCIeバスのスループットは少なくとも4GB/秒である必要があります。
Tesla C870はそれをサポートしていないため、重複するメモリ転送はありません。ヒントはありますか?
編集2:私のテストプログラム+更新されたタイミング; 読みすぎないように!
関数がコンパイルされcutCreateTimer()ません:'エラー:識別子 "cutCreateTimer"が未定義です'-これは、マシンにインストールされている古いcudaバージョン(2.0)に関連している可能性があります
__host__ void time_int(int print){
static struct timeval t1; /* var for previous time stamp */
static struct timeval t2; /* var of current time stamp */
double time;
if(gettimeofday(&t2, 0) == -1) return;
if(print != 0){
time = (double) (t2.tv_sec - t1.tv_sec) + ((double) (t2.tv_usec - t1.tv_usec)) / 1000000.0;
printf(...);
}
t1 = t2;
}
main:
time(0);
void *x;
cudaMallocHost(&x,1073741824);
void *y;
cudaMalloc(&y, 1073741824);
time(1);
cudaMemcpy(y,x,1073741824, cudaMemcpyHostToDevice);
time(1);
cudaMemcpy(x,y,1073741824, cudaMemcpyDeviceToHost);
time(1);
表示されるタイミングは次のとおりです。0.86
秒の割り当て
0.197秒の最初のコピー
5.02秒の2番目のコピー
奇妙なことに、最初のコピーでは0.197秒と表示されますが、プログラムの実行を見るとはるかに時間がかかります。