Форум программистов, компьютерный форум CyberForum.ru

Программирование под GPU: Вычисление произведения матрицы на вектор - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Может ли виртуальная функция возвращать значения разных типов? http://www.cyberforum.ru/cpp-beginners/thread1176874.html
Привет, форумчане! :) Столкнулся с небольшой проблемкой и интересуюсь ответом на вопрос! Может ли виртуальная функция возвращать значения различных типов?! И если не может, то можно либо как-то хитро извернуться и все же реализовать это какими-либо извращенными методами?! :) Большое спасибо за внимание!
C++ шаблон функции который принимает в параметры массив количиство елементов и должен найти сумму елементов массив шаблон функции который принимает в параметры массив количиство елементов и должен найти сумму елементов массива http://www.cyberforum.ru/cpp-beginners/thread1176873.html
C++ написать 2 перегруженных функции для поиска суммы корней квадратного и линейного уравнения
написать 2 перегруженных функции для поиска суммы корней квадратного и линейного уравнения заранее спасибо Добавлено через 1 час 31 минуту апп
Распечатать строку с заданным номером из текстового файла C++
Задание: Пусть дан текстовый файл.Распечатайте строку с заданным номером. Вот начало дальше не знаю что делать,прошу помощи. #include <stdio.h> int main(int ras, char* ras) { FILE *d; d = fopen("1.txt", "r"); int n;
C++ Заполнить двухмерный массив случайными числами и вывести на экран http://www.cyberforum.ru/cpp-beginners/thread1176839.html
1.Заполнить двухмерный массив случайными числами и вывести на экран. 2.Модифицировать его следующим образом: элементу побочной диагонали присвоить значение равное разности сумм элементов до него и после в соответствующем столбце.
C++ Создать двоичный файл с информацией на скриншоте 1. С помощью текстового редактора создать текстовый документ, в который занести исходную информацию. Рекомендуется вначале занести количество записей, а затем последовательно все записи, причем тестовые поля вводить в отдельной строке, а числовые – можно в отдельной строке или в одной через пробел или разделитель табуляцию. Например, содержимое файла, который будет включать 7 записей –... подробнее

Показать сообщение отдельно
iltat
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 17
15.05.2014, 18:25  [ТС]     Программирование под GPU: Вычисление произведения матрицы на вектор
у меня и матрица и вектор задается в виде одномерного массива.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
int getRazm(int kolQbs){
        int rzm=1;
        for(int i=0;i<kolQbs;i++){
            rzm=rzm*2;
        }
        return rzm;
    }
void getAnyMatrMV(float* matr,float* vctrRe1,float* vctrIm1,int kolQbs){
        int rzm=getRazm(kolQbs);
        DWORD xxx=GetTickCount();
        array_view<float,1> x(rzm,vctrRe1);
        array_view<float,1> x1(rzm,vctrIm1);
        float* vctRtrnRe=new float[rzm];
        float* vctRtrnIm=new float[rzm];
        array_view<float,1> y(rzm,vctRtrnRe);
        array_view<float,1> y1(rzm,vctRtrnIm);
        array_view<float,1> mrc(rzm*rzm,matr);
        //concurrency::extent<1> e(rzm);
        //mrc.discard_data();
        parallel_for_each(mrc.extent, [=](index<1> i) restrict(amp)
        {
            float res=0,res1=0;
            for(int k = 0; k < rzm; k++)
            {
            res+=x(k)*mrc(i*rzm+k);
            res1+=x1(k)*mrc(i*rzm+k);
            }
            y(i)=res;
            y1(i)=res1;
        });
        y.synchronize();
        y1.synchronize();
        y.copy_to(x);
        y1.copy_to(x1);
        DWORD yyy=GetTickCount();
        cout<<yyy-xxx<<endl;
        //getTOG(vctRtrnRe,vctRtrnIm,vctrRe1,vctrIm1,rzm);
    }
getAnyMatrM(float* matr,float* vctrRe1,float* vctrIm1,int kolQbs){
        int rzm=getRazm(kolQbs);
                DWORD xxx=GetTickCount();               
int j=0;
        int k=0;
        float*vctrRe=new float[rzm];
        vctrRe[0]=0;
        float*vctrIm=new float[rzm];
        vctrIm[0]=0;
        
        for(int i=0;i<rzm*rzm;i++){
            vctrRe[j]=vctrRe[j]+vctrRe1[k]*matr[i];
            vctrIm[j]=vctrIm[j]+vctrIm1[k]*matr[i];
            
            if((i+1)%rzm!=0){
                k++;
            }else{
                j++;k=0;
                if(j<rzm){
                    vctrRe[j]=0;
                    vctrIm[j]=0;
                }
            }
        }
        for(int i=0;i<rzm;i++){
            vctrRe1[i]=vctrRe[i];
            vctrIm1[i]=vctrIm[i];
        }
DWORD yyy=GetTickCount();
        cout<<yyy-xxx<<endl;
    }
 
int _tmain(int argc, _TCHAR* argv[])
{
    int st=10;
    int N=getRazm(st);
    float*vcIm=new float[N];
    float*vcRe=new float[N];
    float*matr=new float[N*N];
    for(int i=0;i<N;i++){
        vcRe[i]=i;
        vcIm[i]=i;
        for(int j=0;j<N;j++){
            matr[i*N+j]=i;
        }
    }
    getAnyMatrM(matr,vcRe,vcIm,st);
    getAnyMatrMV(matr,vcRe,vcIm,st);
    int x;
    cin>>x;
    return 0;
    
}
 
Текущее время: 04:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru