Форум программистов, компьютерный форум 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
20.05.2014, 21:21  [ТС]     Программирование под GPU: Вычисление произведения матрицы на вектор
newbie666,
Вот ГПУ
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
 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);
    }
Вот ЦПУ:
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
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;
    }
Добавлено через 57 секунд
И вот CUDA
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
extern "C" __declspec(dllexport) __global__ void MatrVectMul(float *re,float* im, float *matr,int rzm)
{
    int i = blockIdx.x*blockDim.x+threadIdx.x;
    float sum,sum1;
    if(i<rzm)
    {
    sum=0,sum1=0;
    for (int k=0;k<rzm && i<rzm;k++){
        sum+=matr[i*rzm+k]*re[k];
        sum1+=matr[i*rzm+k]*im[k];
    }
    re[i]=sum;
    im[i]=sum1;
    }
}
extern "C" __declspec(dllexport) void getAnyMatrM(float *vctrRe,float *vctrIm, float *matr,int rzm){
    float *vctrReV,*vctrImV,*matrV;
    // выделение видеопамяти
    cudaMalloc((void **)&vctrReV, sizeof(int)*rzm);
    cudaMalloc((void **)&vctrImV, sizeof(int)*rzm); 
    cudaMalloc((void **)&matrV, sizeof(int)*rzm*rzm);
// копирование из оперативной памяти в видеопамять
    cudaMemcpy(vctrReV, vctrRe, sizeof(int)*rzm, cudaMemcpyHostToDevice);
    cudaMemcpy(vctrImV, vctrIm, sizeof(int)*rzm, cudaMemcpyHostToDevice);
    cudaMemcpy(matrV, matr, sizeof(int)*rzm*rzm, cudaMemcpyHostToDevice);
    // установка количества блоков
    dim3 grid((rzm+255)/256, 1, 1);
    // установка количества потоков в блоке
    dim3 threads(256, 1, 1);
    MatrVectMul<<< grid,threads>>> (vctrReV,vctrImV,matrV,rzm);
    //Синхронизируем с моментом окончания расчетов
    cudaMemcpy(vctrRe, vctrReV, sizeof(int)*rzm, cudaMemcpyDeviceToHost);
    cudaMemcpy(vctrIm, vctrImV, sizeof(int)*rzm, cudaMemcpyDeviceToHost);
    // освобождение памяти
    cudaFree(vctrReV);
    cudaFree(vctrImV);
}
 
Текущее время: 17:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru