我正在使用OpenCL开发一个C++项目.我正在使用CPU作为具有英特尔OpenCL运行时的OpenCL设备
我注意到调用OpenCL函数时有一个奇怪的副作用.这是一个简单的测试:
#include <iostream>
#include <cstdio>
#include <vector>
#include <CL/cl.hpp>
int main(int argc, char* argv[])
{
/*
cl_int status;
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
std::vector<cl::Device> devices;
platforms[1].getDevices(CL_DEVICE_TYPE_CPU, &devices);
cl::Context context(devices);
cl::CommandQueue queue = cl::CommandQueue(context, devices[0]);
status = queue.finish();
printf("Status: %d\n", status);
*/
int ch;
int b = 0;
int sum = 0;
FILE* f1;
f1 = fopen(argv[1], "r");
while((ch = fgetc(f1)) != EOF)
{
sum += ch;
b++;
if(b % 1000000 == 0)
printf("Char %d read\n", b);
}
printf("Sum: %d\n", sum);
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的循环,它通过char读取文件char并添加它们,因此编译器不会尝试优化它.
我的系统是运行Ubuntu 14.10的Core i7-4770K,2TB HDD 16GB DDR3.上面的程序以100MB文件作为输入,大约需要770ms.这与我的硬盘速度一致.到现在为止还挺好.
如果现在反转注释并仅运行OpenCL调用区域,则需要大约200ms.再次,到目前为止,这么好.
如果你取消注释所有,该程序需要超过2000毫秒.我期望770ms + 200ms,但它是2000ms.您甚至可以注意到for循环中输出消息之间的延迟增加.这两个区域(OpenCL调用和读取字符)应该是独立的.
我不明白为什么使用OpenCL会干扰简单的C++ for loop性能.这不是一个简单的OpenCL初始化延迟.
我正在编译这个例子:
g++ weird.cpp -O2 -lOpenCL -o weird
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用Clang ++,但它也是一样的.
这是一件有趣的事。这是因为 getc 在队列实例化时成为线程安全版本,因此时间增加是锁的抓取-释放周期 - 我不确定为什么/如何发生这种情况,但这是 AMD OpenCL 的决定性点带有 intel CPU 的 SDK。我很惊讶我和OP的时间基本相同。
https://software.intel.com/en-us/forums/topic/337984
您可以尝试通过将 getc 更改为 getc_unlocked 来解决此特定问题。
它使我的时间回到了 930 毫秒 - 超过 750 毫秒的时间增加主要花在平台和上下文创建线上。