Ich verwende die neueste CUDA 8.0 mit GTX 1080 und laufe Proben, um die Geschwindigkeit zu testen. (Ich weiß, dass sie nicht die optimale Geschwindigkeit reflektieren, aber ich möchte nur horizontal vergleichen.)CUDA 8.0, GTX 1080, warum ist Vektoraddition langsamer als Matrixmultiplikation um 5x?
In 0_Simple/matrixMul
, die Geschwindigkeit durch den Code gemessen wird, was ergibt:
Performance= 1029.91 GFlop/s, Time= 0.127 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Dann lief ich 0_Simple/vectorAdd
, und kopiere den Geschwindigkeitstestcode von der obigen Probe. d.h .:
// Measure speed
cudaEvent_t start;
cudaEventCreate(&start);
cudaEvent_t stop;
cudaEventCreate(&stop);
cudaEventRecord(start, NULL);
int nIter = 300;
for (int i = 0; i < nIter; i++) {
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);
}
cudaEventRecord(stop, NULL);
cudaEventSynchronize(stop);
float msecTotal = 0.0f;
cudaEventElapsedTime(&msecTotal, start, stop);
float msecPerAdd = msecTotal/nIter;
double flopsPerAdd = numElements;
double gigaFlops = (flopsPerAdd * 1.0e-9f)/(msecPerAdd/1000.0f);
printf("Performance= %.2f GFLOPS, Time= %.3f ms, Size= %.0f Ops\n", gigaFlops, msecPerAdd, flopsPerAdd);
ich vergrößert auch die numElements
50000
-67108864
. Das Geschwindigkeitsergebnis lautet:
Performance= 19.85 GFLOPS, Time= 3.380 ms, Size= 67108864 Ops
was fast 5x langsamer ist.
Ich weiß, dass Beispielcode möglicherweise suboptimal ist, also könnte mir jemand sagen, warum der vectorAdd-Code so langsam ist, und wie man es optimiert?
ich verwende CUDA 8.0 und GTX 1080
welche nummer ist 'numElements'? – kangshiyin
@ kangshiyin, sagte ich in der Post, es ist 67108864, die 64M ist. – HanXu
können Sie den Code Ihres vectorAdd-Kernels anzeigen? Und hast du mit optimierter Optimierung kompiliert? – X3liF