Amazon ec2 在OpenCL中使用PCIe吞吐量时的奇怪行为

Amazon ec2 在OpenCL中使用PCIe吞吐量时的奇怪行为,amazon-ec2,opencl,fpga,pci-e,Amazon Ec2,Opencl,Fpga,Pci E,使用OpenCL测试PCIe的吞吐量,我得到了奇怪的结果 我正在使用PCIe 3,x16。 数据大小=2097152(整数) 数据大小字节=8.388608 MB 代码如下: struct timeval tv1, tv2; gettimeofday(&tv1, NULL); err=clEnqueueWriteBuffer(the_queue, dev_buffer, CL_TRUE, 0, (size_t)sizeof(int)*DATA_SIZE, (void *)host_b

使用OpenCL测试PCIe的吞吐量,我得到了奇怪的结果

我正在使用PCIe 3,x16。 数据大小=2097152(整数) 数据大小字节=8.388608 MB

代码如下:

struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);

err=clEnqueueWriteBuffer(the_queue, dev_buffer, CL_TRUE, 0, (size_t)sizeof(int)*DATA_SIZE, (void *)host_buffer, 0, NULL, &event);
if (err != CL_SUCCESS) {
    printf("Error:clEnqueueWriteBuffer:dbuff_in(code %d)\n\n", err );
    exit(0);
}
clFinish(the_queue);

gettimeofday(&tv2, NULL);

printf ("Total time = %f seconds\n",
       (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
       (double) (tv2.tv_sec - tv1.tv_sec));

err=clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END,sizeof(cl_ulong), &end, NULL);
if (err != CL_SUCCESS) {
    printf("Error in profiling !!!Err code %d\n\n", err );
    exit(0);
}

err=clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START,sizeof(cl_ulong), &start, NULL);
if (err != CL_SUCCESS) {
    printf("Error in profiling !!!Err code %d\n\n", err );
    exit(0);
}

transfertime=transfertime+(end - start) * 1.0e-6f;
printf("%f  ",transfertime/1000);
运行此代码时,我得到以下结果:

总时间=11.2毫秒

传输时间=0.02毫秒

注意:我使用了两种不同的方法来测量传输时间,一种是使用OpenCL评测信息,另一种只是测量代码的开始和结束

考虑到PCIe3 x16的吞吐量为15.62884615 GB,传输数据的理论时间为~0.54毫秒

使用基准点轮廓,我得到的结果比PCIe3的理论最大值快25倍左右,使用标准基准点(代码的起始端)时,我得到的结果比理论速度低约20倍

你能分享一下你的经验吗。 什么是基准测试的正确方法?总的来说,为什么这种行为如此奇怪

PS.该设备为FPGA(VU9P)