Я протестировал следующее на графическом процессоре GTX 690 с 4 ГБ ОЗУ в Windows 7 x64, Visual C++ 10:
Я написал функцию, которая получает 2 вектора и добавляет к 3-му вектору. Задача разбита на 2 устройства GPU. Я постепенно увеличивал размер вектора, чтобы оценить производительность графического процессора. Требуемое время линейно увеличивается относительно размера вектора до определенного момента, а затем скачком вверх. Когда я отключаю каждое из ядер графического процессора, требуемое время остается линейным до конца доступной памяти. Я приложил диаграмму, показывающую требуемое время по сравнению с выделенной памятью.
Вы можете увидеть диаграмму скорости здесь: Диаграмма сравнения скоростей!
Можете ли вы сказать мне, что не так?
Бестс, Рамин
Это мой код:
unsigned BenchMark( unsigned VectorSize )
{
unsigned * D[ 2 ][ 3 ] ;
for ( int i = 0 ; i < 2 ; i++ )
{
cudaSetDevice( i ) ;
for ( int j = 0 ; j < 3 ; j++ )
cudaMalloc( & D[ i ][ j ] , VectorSize * sizeof( unsigned ) ) ;
}
unsigned uStartTime = clock() ;
// TEST
for ( int i = 0 ; i < 2 ; i++ )
{
cudaSetDevice( i ) ;
AddKernel<<<VectorSize/256,256>>>(
D[ i ][ 0 ] ,
D[ i ][ 1 ] ,
D[ i ][ 2 ] ,
VectorSize ) ;
}
cudaDeviceSynchronize() ;
cudaSetDevice( 0 ) ;
cudaDeviceSynchronize() ;
unsigned uEndTime = clock() ;
for ( int i = 0 ; i < 2 ; i++ )
{
cudaSetDevice( i ) ;
for ( int j = 0 ; j < 3 ; j++ )
cudaFree( D[ i ][ j ] ) ;
}
return uEndTime - uStartTime ;
}
__global__ void AddKernel(
const Npp32u * __restrict__ pSource1 ,
const Npp32u * __restrict__ pSource2 ,
Npp32u * __restrict__ pDestination ,
unsigned uLength )
{
unsigned x = blockIdx.x * blockDim.x + threadIdx.x ;
if ( x < uLength )
pDestination[ x ] = pSource1[ x ] + pSource2[ x ] ;
}