cudaMemcpy2D与cudaMemcpy的复制时间问题

zpc_wy 2009-12-25 01:35:11
1、[/size] float *ac, *bc, *cc;
clock_t start, endTime;
size_t pitch_a, pitch_b, pitch_c;
int newn = ((n + BLOCK_SIZE - 1) / BLOCK_SIZE) * BLOCK_SIZE;

start = clock();

cudaMallocPitch((void**) &ac, &pitch_a, sizeof(float) * newn, newn);
cudaMallocPitch((void**) &bc, &pitch_b, sizeof(float) * newn, newn);
cudaMallocPitch((void**) &cc, &pitch_c, sizeof(float) * newn, newn);

cudaMemset(ac, 0, pitch_a * newn);
cudaMemset(bc, 0, pitch_b * newn);

cudaMemcpy2D(ac, pitch_a, a, sizeof(float) * lda, sizeof(float) * n, n, cudaMemcpyHostToDevice);
cudaMemcpy2D(bc, pitch_b, b, sizeof(float) * ldb, sizeof(float) * n, n, cudaMemcpyHostToDevice);


2、// allocate host memory for matrices A and B
unsigned int size_A = WA * HA;
unsigned int mem_size_A = sizeof(float) * size_A;

float* h_A = (float*) malloc(mem_size_A);
unsigned int size_B = WB * HB;
unsigned int mem_size_B = sizeof(float) * size_B;
float* h_B = (float*) malloc(mem_size_B);

// initialize host memory
randomInit(h_A, size_A);
randomInit(h_B, size_B);

// allocate device memory
float* d_A;
cutilSafeCall(cudaMalloc((void**) &d_A, mem_size_A));
float* d_B;
cutilSafeCall(cudaMalloc((void**) &d_B, mem_size_B));

// copy host memory to device
cutilSafeCall(cudaMemcpy(d_A, h_A, mem_size_A,
cudaMemcpyHostToDevice) );
cutilSafeCall(cudaMemcpy(d_B, h_B, mem_size_B,
cudaMemcpyHostToDevice) );



cudaMemcpy2D花的时间比cudaMemcpy多了将近一倍。。。不懂这是为什么?然后我把第一个程序中的cudaMemcpy2D换成cudaMemcpy后花的时间还是不变??
...全文
1011 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpc_wy 2009-12-26
  • 打赏
  • 举报
回复
看了看以前的帖子,确实是测时的问题,加上cudaThreadSynchronize()之后测得copy时间才是对的吧?!
zpc_wy 2009-12-26
  • 打赏
  • 举报
回复
1、//创建时间
unsigned int time = 0;
cutCreateTimer(&time);
cutStartTimer(time);
cudaMemcpy2D(c,n*sizeof(float),dc,pitch_c,n*sizeof (float),n,cudaMemcpyDeviceToHost);
//stop the time
cutStopTimer(time);
printf("Processing time: %f (ms) \n", cutGetTimerValue(time));
cutDeleteTimer(time);
2、 //创建时间
unsigned int time = 0;
cutCreateTimer(&time);
cutStartTimer(time);
cudaMemcpy2D(c, sizeof(float) * n, cc, pitch_c, sizeof(float) * n, n, cudaMemcpyDeviceToHost);
//stop the time
cutStopTimer(time);
printf("Processing time: %f (ms) \n", cutGetTimerValue(time));
cutDeleteTimer(time);


但是还是奇怪在两个不同程序中的cudaMemcpy2D(n、pitch是一样的,类型是float),时间相差很大
zpc_wy 2009-12-26
  • 打赏
  • 举报
回复
后来我发现问题所在了,当时我确实只对这两个函数测时的,但是由于我没有rebuild,所以还是原来的结果,误导我了,真正第一个代码多花的时间是在Kahan求和公式上
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zpc_wy 的回复:]
看了看以前的帖子,确实是测时的问题,加上cudaThreadSynchronize()之后测得copy时间才是对的吧?!
[/Quote]

开始测时1
cudamemcopy.
结束测时1(1:cpu->gpu时间)

开始测时2
启动kernel.
cudaThreadSynchronize.
结束测时2(2:kernel执行时间)

开始测时3
cudamemcopy.
结束测时3(3:gpu->cpu时间)
  • 打赏
  • 举报
回复
你的测时对嘛?
zpc_wy 2009-12-25
  • 打赏
  • 举报
回复
补充一下,lda、ldb、n、WA 等的大小是一样的,即阶数相同

231

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Windows XP
社区管理员
  • CUDA on Windows XP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧