Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何准确测量和比较simple for loop函数的OpenCL速度? 我最近使用一个StULTE实现了(测试)OpenCL,用一个简单的函数来写和更新C++类对象,并发现了我的沮丧,当没有简单的for循环处理内核时,同样的函数实际上更快。_C++_Opencl - Fatal编程技术网

如何准确测量和比较simple for loop函数的OpenCL速度? 我最近使用一个StULTE实现了(测试)OpenCL,用一个简单的函数来写和更新C++类对象,并发现了我的沮丧,当没有简单的for循环处理内核时,同样的函数实际上更快。

如何准确测量和比较simple for loop函数的OpenCL速度? 我最近使用一个StULTE实现了(测试)OpenCL,用一个简单的函数来写和更新C++类对象,并发现了我的沮丧,当没有简单的for循环处理内核时,同样的函数实际上更快。,c++,opencl,C++,Opencl,以下是内核函数: __kernel void function_x_y_(__global myclass_* input,long n) { int gid = get_global_id(0); if(gid<n) input[gid].valuez = input[gid].valuey * input[gid].valuex * 8736; } void function_x_y(){ valuez = valuex * valuey; } 我在两个进程上运行了一个时

以下是内核函数:

 __kernel void function_x_y_(__global myclass_* input,long n)
{

int gid = get_global_id(0);
if(gid<n)
input[gid].valuez = input[gid].valuey * input[gid].valuex * 8736;

}
void function_x_y(){

valuez = valuex * valuey;

}
我在两个进程上运行了一个时钟:

cout<<"Run function in serial\n";
startTime = clock();
for(int i=0;i<100;i++){
thisclass[i].function_x_y();
}
endTime = clock();
cout << "It took (serial) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000) << " ms. " << endl;


cout<<"Run function in parallel using struct to write to object\n";
init_ocl();
startTime = clock();
load_kernel_from_struct("function_x_y_",p_struct,100);      //Loads function and variables into opencl

endTime = clock();
cout << "It took (parallel) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000 ) << " ms. " << endl;
我正在使用Andreas Kloecker的cl helper.c

我不明白这应该更快。欢迎提供任何帮助或建议

有更准确的速度测试吗?这可能是因为初始化分配内存并将数据传输到内核需要时间吗

必须有一种方法来确保它工作得更快可能是我必须在运行函数之前传输和初始化所有内容吗

谢谢,
Hbyte.

您最初的测试只使用100个元素进行测试,这一事实应该是一个关于发生了什么的重要线索,尤其是因为当您将迭代次数增加到500万次时,计时发生了多大的变化

  • C++编译器非常擅长优化循环。特别是迭代次数很少的循环(大约10-10000次)。它可能会将你的一些逻辑折叠成更少的指令,从而大大加快速度
  • OpenCL中存在不可避免的开销,这是由
    • 内核的在线编译
    • 需要将数据传输到GPU可访问内存
    • 同步异步主机的成本←→设备架构
  • 由于计算设备的行为是利用所讨论的计算设备中的数百个、有时甚至数千个内核,因此仅100个元素的循环将完全饱和(一个CPU内核),但通常只饱和GPU内核的一小部分
顺便提一下,我建议您只通过测量工作数据到GPU的提交和检索来执行测试,而不是测量编译内核所花费的时间,因为这将更准确地模拟主机代码(显然是事先编译的)和设备代码之间的比较


当然,如果您计划充分利用GPGPU设备,您需要确保工作负载实际上足够大,可以从并行性中获益,即使设置开销很大。

可能的重复取决于5000000次迭代的迭代次数:它花费了(串行)7133676毫秒。使用struct并行运行函数以写入对象内核函数:functions_u.cl:function_x_uy_u。它花费了(并行)4753831毫秒。我正在使用从这里获取的函数。这就像铲取一粒盐并与镊子性能进行比较。最好的小工作负载延迟是cpu的
cout<<"Run function in serial\n";
startTime = clock();
for(int i=0;i<100;i++){
thisclass[i].function_x_y();
}
endTime = clock();
cout << "It took (serial) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000) << " ms. " << endl;


cout<<"Run function in parallel using struct to write to object\n";
init_ocl();
startTime = clock();
load_kernel_from_struct("function_x_y_",p_struct,100);      //Loads function and variables into opencl

endTime = clock();
cout << "It took (parallel) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000 ) << " ms. " << endl;
Run function in serial
It took (serial) 5 ms. 
Run function in parallel using struct to write to object
It took (parallel) 159010 ms.