9400M встроен в контроллер памяти, а 9600M GT - это дискретная карта, которая подключается к контроллеру памяти через шину PCI-e. Это означает, что когда вы переносите память на 9400M, она просто выделяет ее в системную память. 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 ++, но концепция должна быть такой же.
Надеюсь, это поможет.