同一环境下运行时间问题

  • 2 replies
  • 698 views
同一环境下运行时间问题
« 于: 五月 15, 2020, 05:17:00 pm »
struct  timeval tsBegin,tsEnd;
    long t1Duration,t2Duration;
    gettimeofday(&tsBegin,NULL);
    err = clEnqueueWriteBuffer(queue,src1_memobj,CL_TRUE,0,contenLength,pHostBuffer,0,NULL,NULL);
    check_err(err,"data1 write");
    gettimeofday(&tsEnd,NULL);
    t1Duration = 1000000L*(tsEnd.tv_sec-tsBegin.tv_sec)+(tsEnd.tv_usec-tsBegin.tv_usec);
    gettimeofday(&tsBegin,NULL);
    err = clEnqueueWriteBuffer(queue,src2_memobj,CL_TRUE,0,contenLength,pHostBuffer,0,NULL,NULL);
    check_err(err,"data2 write");
    gettimeofday(&tsEnd,NULL);
    t2Duration = 1000000L*(tsEnd.tv_sec-tsBegin.tv_sec)+(tsEnd.tv_usec-tsBegin.tv_usec);

    printf("t1 duration: %ld,t2 duration:%ld\n",t1Duration,t2Duration);


t1 duration: 15,t2 duration:4

Re: 同一环境下运行时间问题
« 回复 #1 于: 五月 15, 2020, 08:37:36 pm »
struct  timeval tsBegin,tsEnd;
    long t1Duration,t2Duration;
    gettimeofday(&tsBegin,NULL);
    err = clEnqueueWriteBuffer(queue,src1_memobj,CL_TRUE,0,contenLength,pHostBuffer,0,NULL,NULL);
    check_err(err,"data1 write");
    gettimeofday(&tsEnd,NULL);
    t1Duration = 1000000L*(tsEnd.tv_sec-tsBegin.tv_sec)+(tsEnd.tv_usec-tsBegin.tv_usec);
    gettimeofday(&tsBegin,NULL);
    err = clEnqueueWriteBuffer(queue,src2_memobj,CL_TRUE,0,contenLength,pHostBuffer,0,NULL,NULL);
    check_err(err,"data2 write");
    gettimeofday(&tsEnd,NULL);
    t2Duration = 1000000L*(tsEnd.tv_sec-tsBegin.tv_sec)+(tsEnd.tv_usec-tsBegin.tv_usec);

    printf("t1 duration: %ld,t2 duration:%ld\n",t1Duration,t2Duration);


t1 duration: 15,t2 duration:4

我无法为你解释μs级别的时间差异(即你的4μs和15μs).

在此微小的时间量级上, 无论是数据本身, 还是代码本身所使用的I-Cache, 或者是其他效果, 都可能会造成差异.

建议的解决方案:
(A)将数据量提升到常见的级别(例如ms级别的传输, 或者至少几百μs的), 或者,
(B)维持你的数据量不变, 但是改成连续传输三次, 使用第二次和第三次的访问/传输/API调用, 然后重新评估差异. 而不是第一次和第二次.

此外, OpenCL规范的实现比较灵活, 具体某个memory object的位置, 无法明确的确定(和你实现是否访问过这段数据, 如何访问的, 都可能有关系). 因此这应当作为一种考虑因素.
« 最后编辑时间: 五月 15, 2020, 08:42:01 pm 作者 屠戮人神 »

Re: 同一环境下运行时间问题
« 回复 #2 于: 五月 18, 2020, 10:50:31 am »
谢谢,对您说的第二次或者第三次的时间比较应该是基本一致的,甚至多运行几次时间也是基本一致的,由于电脑的限制(虚拟机)使用大数据的buffer跑会出错,暂时还没有解决。