Я определяю, сколько времени требуется моей программе CUDA для вычисления матриц определенного размера. Например, 10x10, 100x100, 500x500,100x1000.CUDA Время События
Однако результаты совсем не то, что я ожидал. Числа для графика не соответствуют ожидаемому. С увеличением размера матриц время вычислений уменьшается.
Например, здесь среднее время (от 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 и размер количество элементов я в матрице. И.Е. Матрица 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];
}
Вы проверяете коды возврата из выполнения ядра? Может быть, на 500 ядро не удалось запустить – flipchart
Как вы вычисляете blocksNeeded и размер? –
Вы пробовали без cudaDeviceSynchronize? Это не требуется для синхронизации, и это может повлиять на результаты (даже если это не так, как вы описали). И +1 к другим комментариям. – jmsu