CUDA: пожалуйста, помогите мне найти ошибку в моем коде - PullRequest
2 голосов
/ 08 августа 2011

Есть код, который использует GPU:

__global__ void gpu_process(float* input, float* weights, float* output, int psize, int size)
{
    int i = blockIdx.x*blockDim.x + threadIdx.x;
    int j = blockIdx.y*blockDim.y + threadIdx.y;
    if(i < psize && j < size)
        output[j] += input[i] * weights[i * size + j];
}
void process(float* input, float* weights, float* output, size_t psize, size_t size)
{
    float* in_d, *w_d, *out_d;
    cudaMalloc((void**)&in_d, psize * sizeof(float));
    cudaMalloc((void**)&w_d, psize * size * sizeof(float));
    cudaMalloc((void**)&out_d, size * sizeof(float));
    for(size_t i = 0; i < size; i++)
        output[i] = 0;
    cudaMemcpy(in_d, input, psize * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(w_d, weights, psize * size * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(out_d, output, size * sizeof(float), cudaMemcpyHostToDevice);
    int rx = psize, ry = size, block_x = min((int)psize, 32), block_y = min((int)size, 32);
    dim3 dimBlock(block_x, block_y);
    dim3 dimGrid(ceil(float(rx) / block_x), ceil(float(ry) / block_y));
    gpu_process<<<dimGrid, dimBlock>>>(in_d, w_d, out_d, psize, size);
    cudaThreadSynchronize();
    cudaMemcpy(output, out_d, size * sizeof(float), cudaMemcpyDeviceToHost);
    cudaFree(in_d);
    cudaFree(out_d);
    cudaFree(w_d);
}

Есть код, который делает то же самое, но использует только CPU:

int blockIdxx, blockIdxy, blockDimx, blockDimy, threadIdxx, threadIdxy;
void cpu_process(float* input, float* weights, float* output, int psize, int size)
{
    int i = blockIdxx*blockDimx + threadIdxx;
    int j = blockIdxy*blockDimy + threadIdxy;
    if(i < psize && j < size)
        output[j] += input[i] * weights[i * size + j];
}
void process(float* input, float* weights, float* output, size_t psize, size_t size)
{
    for(size_t i = 0; i < size; i++)
            output[i] = 0;
    int rx = psize, ry = size, block_x = min((int)psize, 32), block_y = min((int)size, 32);
    blockDimx = block_x;
    blockDimy = block_y;
    int gridDimx = ceil(float(rx) / block_x), gridDimy = ceil(float(ry) / block_y);
    for(blockIdxx = 0; blockIdxx < gridDimx; blockIdxx++)
        for(blockIdxy = 0; blockIdxy < gridDimy; blockIdxy++)
            for(threadIdxx = 0; threadIdxx < blockDimx; threadIdxx++)
                for(threadIdxy = 0; threadIdxy < blockDimy; threadIdxy++)
                    cpu_process(input, weights, output, psize, size);
}

Почему вариант CPU работает правильно, но вариант GPUвозвращает мусор в вывод?Чем отличается

Версия набора инструментов cuda: 4.0

ОС: Debian GNU / Linux, cuda, установленная из репозиториев.

Графический процессор: NVIDIA GeForce GT 525M.

1 Ответ

0 голосов
/ 29 августа 2011

cudaThreadSyncronize устарела и не должна использоваться, вместо этого используйте cudaDeviceSyncronize, проверьте их коды ошибок, так как они вернут ошибку, если поток потерпел неудачу.Они также блокируют весь код до тех пор, пока задача не будет завершена, поэтому вы также можете добавить некоторый промежуточный код, чтобы найти узкие места.

...