CUDA: помогите разобратся, почему не работает

Модератор: Модераторы разделов

frp
Сообщения: 1445
ОС: Debian Squeeze

CUDA: помогите разобратся, почему не работает

Сообщение frp »

Код: Выделить всё

#include <cuda.h>
#include <cmath>
using namespace std;
__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] = 1;
        //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, 1024), block_y = min((int)size, 1024);
    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);
}

input и weights содержат гарантированно не нули. Почему содержимое output не изменяется?

Код - часть реализации многослойного перцептрона. Данный код считает взвешенные суммы входов для нейронов одного слоя. input - выходы нейронов предыдущего слоя, weights - веса синапсов, output - выходы нейронов текущего слоя (функция активации применяется в другом куске кода).

Помогите разобраться, что в данном коде не так.
Спасибо сказали: