Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2023, 20:22   #1
Raven!
 
Регистрация: 04.02.2020
Сообщений: 9
По умолчанию Для заданного положительного числа n найти CUDA

Добрый день. Помогите, пожалуйста. Я очень плохо разбираюсь в C++ или CUDA, но очень надо сделать.

Задание.
9. Для заданного положительного числа n найти количество различных способов его получения в результате суммирования заданного количества k положительных целых чисел (например, 5=1+1+3=1+2+2 – итого 2 способа выразить 5 как сумму 3-х чисел).

Я нашла код, в котором используются OMP и IMP. но это не то. Помогите, пожалуйста его переделать под CUDA.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>
#include <omp.h>
 
#define ll long long
#define COMM MPI_COMM_WORLD
 
void finder(ll array_size, ll k, ll n, ll max_num, ll* k_sum_wvar){
 
    ll i;
 
    if (k >= 0){
        for (i = max_num; i > 0; i--){
            k_sum_wvar[k] = i;
            finder(array_size, k - 1, n, i, k_sum_wvar);
        }
    }
 
    if (k == -1){
        for (i = 0; i < array_size; i++){
            n -= k_sum_wvar[i];
        }
        if (n == 0){
            k_sum_wvar[array_size]++;
 
            /*
            // Запись найденного верного варианта
            for (i = 0; i < array_size - 1; i++)
                printf("%lld+", k_sum_wvar[i]);
            printf("%lld\n", k_sum_wvar[array_size - 1]);
            */
        }
    }
}
 
// Первый параметр - n; второй параметр - k
int main(int argc, char** argv){
 
    int rank, np;
    MPI_Status status;
 
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(COMM, &rank);
    MPI_Comm_size(COMM, &np);
    
    double start_time, end_time;
 
    FILE *outputFile;
    if ((outputFile = fopen("out.txt", "w")) == NULL){
        printf("can't make file!\n");
    }
 
    ll n = atoi(argv[1]);
    ll k = atoi(argv[2]);
    if (rank == 0){
        printf("n = %lld, k = %lld;", n, k);
    }
 
    // Массив, где будут сохраняться перебирающиеся числа
    ll* k_sum = malloc(sizeof(ll)*(k + 1));
 
    // Здесь будет храниться количество способов перебора
    k_sum[k] = 0;
 
    // Максимальное число, которое возможно при переборе
    ll max_num = n - k + 1;
    
 
    /* === ПОСЛЕДОВАТЕЛЬНОЕ ВЫЧИСЛЕНИЕ === */
 
    
    // Первый процессор решает задачу последовательно
    if (rank == 0){
        start_time = omp_get_wtime();
 
        finder(k, k - 1, n, max_num, k_sum);
 
        end_time = omp_get_wtime();
 
        printf("\nSequential evaluation completed for %f seconds", end_time - start_time);
        fprintf(outputFile, "\nNumber of variations: %lld\n", k_sum[k]);
        printf("\nSequential: Number of variations: %lld\n", k_sum[k]);
    }
    
 
    /* === ПАРАЛЛЕЛЬНОЕ ВЫЧИСЛЕНИЕ === */
 
    
    start_time = omp_get_wtime();
 
    k_sum[k] = 0;
    ll i;
 
    for (i = max_num - rank; i > 0; i -= np){
        k_sum[k - 1] = i;
        finder(k, k - 2, n, i, k_sum);
    }
 
    // Собираем результат из каждого процессора в сумму у 0-го процессора с помощью коллективной функции
    ll sum = 0;
    MPI_Reduce(&k_sum[k], &sum, 1, MPI_LONG_LONG, MPI_SUM, 0, COMM);
 
    end_time = omp_get_wtime();
 
    if (rank == 0){
        printf("\nParallel evaluation completed for %f seconds", end_time - start_time);
        printf("\nParallel: Number of variations: %lld\n", sum);
    }
    
    free(k_sum);
    fclose(outputFile);
    
    MPI_Finalize();
 
    return 0;
}
Raven! вне форума Ответить с цитированием
Старый 21.03.2023, 18:23   #2
Raven!
 
Регистрация: 04.02.2020
Сообщений: 9
По умолчанию

Никто не может помочь?
Raven! вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти первые n членов, их сумму,найти первый член заданной последовательности больше заданного числа L и указать его номер. ВолДим Помощь студентам 1 26.01.2016 18:51
реализовать на CUDA вычисление факториала большого числа. сравнить время вычислений на процессоре и на видеокарте, найти ускорение Люля. Помощь студентам 0 13.12.2013 15:24
одномерный массив - найти сумму отрицательных меньше заданного числа и количество положительных больше заданного числа ALEXXELA Паскаль, Turbo Pascal, PascalABC.NET 2 02.12.2012 20:13
найти сумму первой и последней цифр любого целого положительного числа. Лина94 Помощь студентам 5 01.02.2012 23:09
вычислить сумму цифр заданного целого положительного числа (Паскаль) prs58 Помощь студентам 5 17.10.2011 22:15