9400M 集成到您的内存控制器中,而 9600M GT 是一个独立的卡,通过 PCI-e 总线连接到您的内存控制器。这意味着当您将内存传输到 9400M 时,它只是将其分配到系统 RAM 中。另一方面,9600M 通过 PCI-e 将数据发送到卡上的专用图形内存。这种转移使您的基准测试看起来更慢。
如果您想比较两张显卡的性能,您应该使用 OpenCL 分析功能,而不是您当前使用的时钟功能。
cl_int clGetEventProfilingInfo (cl_event event, cl_profiling_info param_name,
size_t param_value_size, void *param_value, size_t *param_value_size_ret)
向函数传递在您对内核进行排队时创建的事件,并将第二个参数传递给 CL_PROFILING_COMMAND_START 以获取内核的起点(以纳秒为单位),并将 CL_PROFILING_COMMAND_END 传递给它以获取内核的终点。确保在内核执行完成后使用此命令(事件保持其值直到超出范围。)您还可以通过将此函数应用于事件来获取将数据传输到设备所花费的时间从缓冲区的入队开始。这是一个例子:
TRACE("Invoking the Kernel")
cl::vector<cl::Event> matMultiplyEvent;
cl::NDRange gIndex(32,64);
cl::NDRange lIndex(16,16);
err = queueList["GPU"]->enqueueNDRangeKernel(
matrixMultiplicationKernel,
NULL,
gIndex,
lIndex,
&bufferEvent,
matMultiplyEvent);
checkErr(err, "Invoke Kernel");
TRACE("Reading device data into array");
err = queueList["GPU"]->enqueueReadBuffer(thirdBuff,
CL_TRUE,
0,
(matSize)*sizeof(float),
testC,
&matMultiplyEvent,
bufferEvent);
checkErr(err, "Read Buffer");
matMultiplyEvent[0].wait();
for (int i = 0; i < matSize; i++) {
if (i%64 == 0) {
std::cout << "\n";
}
std::cout << testC[i] << "\t";
}
long transferBackStart = bufferEvent[0].getProfilingInfo<CL_PROFILING_COMMAND_START>();
long transferBackEnd = bufferEvent[0].getProfilingInfo<CL_PROFILING_COMMAND_END>();
double transferBackSeconds = 1.0e-9 * (double)(transferBackEnd- transferBackStart);
long matrixStart = matMultiplyEvent[0].getProfilingInfo<CL_PROFILING_COMMAND_START>();
long matrixEnd = matMultiplyEvent[0].getProfilingInfo<CL_PROFILING_COMMAND_END>();
double dSeconds = 1.0e-9 * (double)(matrixEnd - matrixStart);
此示例使用 C++ 包装器,但概念应该相同。
希望这可以帮助。