проблема с поиском минимального значения 2d массива с CUDA - PullRequest
0 голосов
/ 09 апреля 2020

Я изучаю CUDA и пишу программу, чтобы найти минимальное значение двухмерного массива. Определена память для работы функции графического процессора. Называется функция. Но в результате появляется мусор. Предоставляем код с поиском процессора и графического процессора. Уже понятия не имею, что не так, обратитесь за помощью

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int call(int rows, int cols, int &min, int **arr) {
    min = arr[0][0];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (min > arr[i][j]) { min = arr[i][j]; }
        }
    }
    return min;
}

__global__ void call_gpu(int rows, int cols, int *mini, int **arr) {   //main function 
    int idx = blockIdx.x*blockDim.x + threadIdx.x;
    int idy = blockIdx.y*blockDim.y + threadIdx.y;
    int temp;
    if ((idx < rows) && (idy < cols)) {
        temp = arr[idx][idy];
        for (int i = 0; i < rows; i++) {
            for (int y = 0; y < cols; y++) {
                if (temp > arr[idx][idy]) {
                    temp = arr[idx][idy];
                    *mini = arr[idx][idy];
                }
            }
        }
    }
}

int main()
{
    int rows, cols, min, result;
    printf("Enter the height/width of the matrix\n");
    scanf_s("%d", &rows);
    scanf_s("%d", &cols);

    int **arr = new int*[rows];
    for (int i = 0; i < rows; i++) {
        arr[i] = new int[cols];
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = rand();
        }
    }

    int *mini;
    cudaMalloc((int**)&mini, sizeof(int));

    int *marr;
    size_t pitcharr;
    cudaMallocPitch(&marr, &pitcharr, cols * sizeof(int), rows);
    cudaMemcpy2D(marr, pitcharr, arr, cols * sizeof(int), cols * sizeof(int), rows, cudaMemcpyHostToDevice);

    call_gpu << <1, 1 >> > (rows, cols, mini, arr);

    cudaDeviceSynchronize();
    cudaMemcpy(&result, mini, sizeof(int), cudaMemcpyDeviceToHost);
    printf("Result from GPU = %d\n", result);

    /*for (int i = 0; i < rows; i++) {     //outup on display
        for (int j = 0; j < cols; j++) {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }*/

    call(rows, cols, min, arr);  //CPU function

    printf("min = %d\n", min);
    system("pause");
    cudaFree(marr);
    cudaFree(mini);
    delete[] arr;
    return 0;
}

Как исправить, укажите ошибки. Было бы неплохо конкретно посмотреть, в чем я был не прав

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...