Я рассчитываю, сколько времени понадобится моей программе CUDA для вычисления матриц определенного размера.Например, 10x10, 100x100, 500x500, 100x1000.
Однако результаты совсем не те, что я ожидал.Числа на графике не соответствуют ожидаемым.С увеличением размера матриц время вычислений уменьшается.
Например, вот среднее время (из 1000 прогонов): 10x10: 0.032768s 100x100: 0.068960s 500x500: 0.006336s 1000x1000: 0.018400s
Время уменьшается, затем снова увеличиваетсяна 1000. Что происходит?Разве цифры не должны достигать пика в определенной точке?Почему это происходит на американских горках, как это?
Вот как выполняется фактический тайминг-код:
int blocksNeeded=0;
cudaError_t cudaStatus;
blocksNeeded=(size/MAXTHREADS)+1;
int threadsPerBlock = MAXTHREADS/blocksNeeded+1;
cudaEvent_t start, stop;
float elapsedtime;
.
.
.
.
.
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
addKernel<<<blocksNeeded, size>>>(dev_c, dev_a, dev_b,size);
cudaStatus = cudaDeviceSynchronize();
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedtime, start, stop);
cudaEventDestroy(start);
cudaEventDestroy(stop);
, где MAXTHREADS - 1024, а size - количество элементов Iиметь в матрице.Матрица IE 10x10 будет иметь 100 элементов, что по размеру.
Обновлено с ядром:
__global__ void addKernel(float *c, float *a, float *b,int size)
{
int idx = blockDim.x * blockIdx.x + threadIdx.x;
if(idx < size)
c[idx] = a[idx] + b[idx];
}