Возможно, что тест обманывает.
Вот один из временных кодов:
cutilSafeCall( cudaEventRecord( start, 0 ) );
if( PINNED == memMode )
{
for( unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++ )
{
cutilSafeCall( cudaMemcpyAsync( h_odata, d_idata, memSize,
cudaMemcpyDeviceToHost, 0) );
}
}
else
{
for( unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++ )
{
cutilSafeCall( cudaMemcpy( h_odata, d_idata, memSize,
cudaMemcpyDeviceToHost) );
}
}
cutilSafeCall( cudaEventRecord( stop, 0 ) );
Обратите внимание, что тест использует разные функции для создания MemCPY для разных типов памяти.Я думаю, это обман, потому что основное различие между режимами заключается в том, как распределяется память, с cudaHostAlloc для закрепленного и с malloc для закрепленного.
Различные функции Memcpy могут иметь различные пути проверки ошибок и настройки передачи.
Итак, попробуйте изменить тест и выполнить копирование в обоих режимах с помощью cudaMemcpy()
, например, изменив все ifs после cudeEventRecord(...)
на if( 0 && (PINNED == memMode) )