CUDA中的响应时间问题为什么cpu比gpu快?

CUDA中的响应时间问题为什么cpu比gpu快?,cuda,Cuda,嗨,我的时间响应有问题,我在GPU上的响应时间比CPU长 使用的算法是矩阵乘法算法 使用以下功能: // Start timers cudaEvent_t timer1, timer2; cudaEventCreate(&timer1); cudaEventCreate(&timer2); cudaEventRecord(timer1, 0); cudaEventSynchronize(timer1); // Stop timers cudaEventRecord(ti

嗨,我的时间响应有问题,我在GPU上的响应时间比CPU长 使用的算法是矩阵乘法算法

使用以下功能:

// Start timers
cudaEvent_t timer1, timer2;
cudaEventCreate(&timer1);
cudaEventCreate(&timer2);
cudaEventRecord(timer1, 0);
cudaEventSynchronize(timer1);

// Stop timers
    cudaEventRecord(timer2, 0);
    cudaEventSynchronize(timer1);
    cudaEventSynchronize(timer2);
    float elapsed;
    cudaEventElapsedTime(&elapsed, timer1, timer2);

    cudaDeviceReset();
    return elapsed;
以下是我在GPU上的代码:

float Mult_gpu(float* hostPtr, float* hostPtr2, float* hostPtr3, int size, int Ncols, int Nrows, int n) {
size_t pitch;

check("Creating timers");
cudaEvent_t timer1, timer2;
cudaEventCreate(&timer1);
cudaEventCreate(&timer2);
cudaEventRecord(timer1, 0);
cudaEventSynchronize(timer1);

/******************************************/
/***Configuracion de las matrices en gpu***/
/******************************************/
float* devPtr;
cudaMallocPitch(&devPtr, &pitch, n * sizeof(float), Nrows);
cudaMemcpy2D(devPtr, pitch, hostPtr, n * sizeof(float), n * sizeof(float), Nrows, cudaMemcpyHostToDevice);

float* devPtr2;
cudaMallocPitch(&devPtr2, &pitch, Ncols * sizeof(float), n);
cudaMemcpy2D(devPtr2, pitch, hostPtr2, Ncols * sizeof(float), Ncols * sizeof(float), n, cudaMemcpyHostToDevice);

float* devPtr3;
cudaMallocPitch(&devPtr3, &pitch, Ncols * sizeof(float), Nrows);

//dim3 gridSize(iDivUp(Ncols3, BLOCKSIZE_x), iDivUp(Nrows3, BLOCKSIZE_y));
//dim3 blockSize(BLOCKSIZE_y, BLOCKSIZE_x);
dim3 block(32, 32);                                                     //hilos por bloque
dim3 grid((size / block.x) + 1, (size / block.y) + 1);                  //numero de bloques

/**************************/
/**Lanzamiento del kernel**/
/**************************/

Mult << <grid, block >> > (devPtr, devPtr2, devPtr3, pitch, Ncols, Nrows, n);
cudaDeviceSynchronize();

/*********************************/
/***Copiado de devPtr a hosPtr2***/
/*********************************/
cudaMemcpy2D(hostPtr3, Ncols * sizeof(float), devPtr3, pitch, Ncols * sizeof(float), Nrows, cudaMemcpyDeviceToHost);
//cudaMemcpy(hostPtr3, devPtr3, size * sizeof(float), cudaMemcpyDeviceToHost);

cudaFree(devPtr);
cudaFree(devPtr2);
cudaFree(devPtr3);
// Stop timers
cudaEventRecord(timer2, 0);
cudaEventSynchronize(timer1);
cudaEventSynchronize(timer2);
float elapsed;
cudaEventElapsedTime(&elapsed, timer1, timer2);

cudaDeviceReset();
return elapsed;
float Mult\u gpu(float*hostPtr,float*hostPtr2,float*hostPtr3,int size,int Ncols,int Nrows,int n){
大小和间距;
检查(“创建计时器”);
cudaEvent_t timer1、timer2;
cudaEventCreate(&timer1);
cudaEventCreate(&timer2);
cudaEventRecord(计时器1,0);
cudaEventSynchronize(计时器1);
/******************************************/
/***gpu上的矩阵配置***/
/******************************************/
浮动*devPtr;
cudaMallocPitch(&devPtr,&pitch,n*sizeof(float),Nrows);
cudaMemcpy2D(devPtr、pitch、hostPtr、n*sizeof(float)、n*sizeof(float)、Nrows、cudaMemcpyHostToDevice);
浮动*devPtr2;
cudaMallocPitch(&devPtr2,&pitch,Ncols*sizeof(float),n);
cudaMemcpy2D(devPtr2,俯仰,hostPtr2,Ncols*sizeof(float),Ncols*sizeof(float),n,cudaMemcpyHostToDevice);
浮动*devPtr3;
cudaMallocPitch(&devPtr3,&pitch,Ncols*sizeof(float),Nrows);
//dim3网格大小(iDivUp(Ncols3,块大小_x),iDivUp(Nrows3,块大小_y));
//dim3块大小(块大小为y,块大小为x);
dim3块(32,32);//hilos por bloque
dim3网格((size/block.x)+1,(size/block.y)+1);//bloques数字
/**************************/
/**兰扎米恩托内核酒店**/
/**************************/
Mult>(devPtr、devPtr2、devPtr3、音高、Ncols、Nrows、n);
cudaDeviceSynchronize();
/*********************************/
/***科皮亚多devPtr a医院2***/
/*********************************/
cudaMemcpy2D(主机ptr3,Ncols*sizeof(float),devPtr3,音高,Ncols*sizeof(float),Nrows,cudamemcpydevicetoost);
//cudaMemcpy(hostPtr3,devPtr3,size*sizeof(float),cudaMemcpyDeviceToHost);
库达弗里(devPtr);
cudaFree(devPtr2);
cudaFree(devPtr3);
//停止计时器
cudaEventRecord(时间2,0);
cudaEventSynchronize(计时器1);
cudaEventSynchronize(timer2);
浮子过去了;
CUDAEventReleasedTime(已用时间和计时器1、计时器2);
cudaDeviceReset();
返回时间已过;
}

这是我在CPU上的代码

   float Mult_cpu(float* hostPtrA, float* HostPtrB, float* hostPtrC, int Ncols, int Nrows, int n)
{
    cudaEvent_t timer1, timer2;
    cudaEventCreate(&timer1);
    cudaEventCreate(&timer2);
    cudaEventRecord(timer1, 0);
    cudaEventSynchronize(timer1);

    for (int i = 0; i < Nrows; ++i) {
        for (int j = 0; j < Ncols; ++j) {
            float suma = 0;
            for (int k = 0; k < n; ++k) {
                suma += hostPtrA[i * n + k] * HostPtrB[k * Ncols + j];
            }
            hostPtrC[i * Ncols + j] = suma;

        }
    }

    // Stop timers
    cudaEventRecord(timer2, 0);
    cudaEventSynchronize(timer1);
    cudaEventSynchronize(timer2);
    float elapsed;
    cudaEventElapsedTime(&elapsed, timer1, timer2);

        return elapsed;
    }
浮点多cpu(浮点*hostPtrA,浮点*HostPtrB,浮点*hostPtrC,int-Ncols,int-Nrows,int-n) { cudaEvent_t timer1、timer2; cudaEventCreate(&timer1); cudaEventCreate(&timer2); cudaEventRecord(计时器1,0); cudaEventSynchronize(计时器1); 对于(int i=0;i 当我使用矩阵500x500或任何矩阵时,CPU比GPU快,我不明白为什么我不知道问题是我的内核程序还是我使用的CUDA函数

我的内核代码

__global__ void Mult(float* devPtrA, float* devPtrB, float* devPtrC, size_t pitch, int Ncols, int Nrows, int n)
{
    float temp;

    int r = blockDim.y * blockIdx.y + threadIdx.y;      //for (int f = 0; f <= fil - 1; f += 1) equivalencia en for
    int c = blockDim.x * blockIdx.x + threadIdx.x;      //for (int c = 0; c <= col - 1; c += 1)
    if ((r < Ncols) && (c < Nrows)) {
        for (int c2 = 0; c2 < n; c2++) {
            float* vertical = (float*)((char*)devPtrA + r * pitch);
            float element1 = vertical[c2];
            float* horizontal = (float*)((char*)devPtrB + c2 * pitch);
            float element2 = horizontal[c];
            temp += element1 * element2;
        }


        //printf("\nla fila es: %d la columna es: %d el valor es: %8.4f\n\n", r, c, temp);
        float* vertical2 = (float*)((char*)devPtrC + r * pitch);
        vertical2[c] = temp;
    }
}
\uuuuu全局\uuuuuuuuuuvoid Mult(浮点*devPtrA,浮点*devPtrB,浮点*devPtrC,大小音调,整数Ncols,整数Nrows,整数n)
{
浮子温度;

int r=blockDim.y*blockIdx.y+threadIdx.y;//for(int f=0;f您应该阅读的概念。用a分析您的CUDA内核性能。我怀疑条件
if((r
会导致每个扭曲中的线程发散,从而降低性能。此外,
间距
也会影响代码中的全局内存访问模式,这是影响CUDA内核性能的另一个因素。还可以找到一些其他优秀的优化技巧。

您应该阅读。分析CUDA的概念我怀疑条件
if((r
在内核中会导致每个扭曲中的线程发散,从而降低性能。此外,
间距
会影响代码中的全局内存访问模式,这是影响CUDA内核性能的另一个因素。可以找到其他一些优秀的优化技巧。

CudaMalloc的速度非常慢。如果您知道自己的大小r矩阵,在程序开始时进行初始化。

Cudamaloc速度非常慢。如果您事先知道矩阵的大小,请在程序开始时进行初始化。

为什么GPU会自动快于CPU?为什么GPU会自动快于CPU?