LINUX.ORG.RU

CUDA: помогите найти ошибку в коде


0

1
#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);
}

Почему оно не изменяет содержимое output-а? В wights и input - гарантированно не нули. То же самое для CPU работает нормально.

PS. Сразу отвечаю на вопрос, который был бы задан в первом же ответе: хочу реализовать нейронную сеть, которая считалась бы на GPU. input - входы текущего слоя, output - массив взвешенных сумм на выходах нейронов текущего слоя, weights - веса, psize - размер предыдущего слоя, size - размер текущего слоя. С CUDA до этого дела не имел.

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Ты проверь, запускается ли вообще твой кернел, в документации есть функция, которая возвращает последнюю ошибку, что-то вроде getLastError.

cvb
()
Ответ на: комментарий от cvb

ps Юзай дебагер, под винду он есть бесплатный, под линуксом как-то можно дебажить при помощи gdb.

cvb
()

Я натыкался на подобные проблемы, когда пытался запустить ядро с неправильным количеством потоков. Возможно, это проблемы старой куды.

Попробуйте явно указать 1 блок и, скажем, 64 потока - чтобы наверняка запустилось.

Eddy_Em ☆☆☆☆☆
()

dim3 dimGrid(ceil(float(rx) / block_x), ceil(float(ry) / block_y));

Вот это сразу резануло глаз. Это же можно вычислить с помощью целочисленных вычислений. Глянь в дебагере, скорее всего у тебя мусор в dimGrid содержится.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.