На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> C++ AMP - не комплируется пример из книги
    Теперь пытаюсь поработать с C++ AMP. Windows 7, VS 2012. В программе из книги C++ AMP
    ExpandedWrap disabled
      #include <string>
      #include <iostream>
      #include <Windows.h>
      #include <memory.h>
      #include <stdio.h>
      #include <time.h>
      #include <amp.h>
      #include <ppl.h>
       
      using namespace std;
      using namespace concurrency;
       
      void AddArrays(int n, const double* const pA, const double* const pB, double* const pC)
      {
        clock_t start, finish, duration;
        start = clock();
        for(int i = 0; i < n; ++i)
        {
          pC[i] = pA[i] + pB[i];
        }
        finish = clock();
        duration = finish - start;
        cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета без OpenMP" << endl;
      }
       
      void AddArraysAmp(int n, const int* const pA, const int* const pB, int* const pC)
      {
        clock_t start, finish, duration;
        start = clock();
        array_view<int, 1> a(n, pA);
        array_view<int, 1> b(n, pB);
        array_view<int, 1> c(n, pC);
        parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)
        {
          c[idx] = a[idx] + b[idx];
        });
        finish = clock();
        duration = finish - start;
        cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета C++ AMP" << endl;
      }
       
      int main()
      {
        setlocale(LC_ALL, "");
        int n = 15000;
        double* pA = (double*) malloc(sizeof(double)*n);
        double* pB = (double*) malloc(sizeof(double)*n);
        double* pC = (double*) malloc(sizeof(double)*n);
        for(int i = 0; i < n; ++i)
        {
          pA[i] = (double) i;
          pB[i] = (double) i;
          pC[i] = (double) 0;
        }
        AddArrays(n, pA, pB, pC);
        AddArraysAmp(n, pA, pB, pC);
        free(pA);
        free(pB);
        free(pC);
        system("\npause");
      }
    получаю ошибки:
    error C2228: выражение слева от ".data" должно представлять класс, структуру или объединение c:\program files\microsoft visual studio 11.0\vc\include\amp.h 2250 1 CpuGpu
    error C2228: выражение слева от ".data" должно представлять класс, структуру или объединение c:\program files\microsoft visual studio 11.0\vc\include\amp.h 2253 1 CpuGpu
    error C2338: container element type and array view element type must match c:\program files\microsoft visual studio 11.0\vc\include\amp.h 2253 1 CpuGpu
    error C2228: выражение слева от ".size" должно представлять класс, структуру или объединение c:\program files\microsoft visual studio 11.0\vc\include\amp.h 2255 1 CpuGpu
    Почему возникает эта ошибка в заголовочном файле Microsoft? Проект прикрепил
    Прикреплённый файлПрикреплённый файлCpuGpuAmp.zip (2,25 Кбайт, скачиваний: 332)
    Сообщение отредактировано: tuchin -
      Скорее всего, где-то требуется std::vector, вместо указателя

      Добавлено
      Либо какой-то из массивов apm

      Добавлено
      Цитата Олег М @
      array_view<int, 1> a(n, pA);

      Здесь требуется обычный указатель, а ты передаёшь константный, она не может найти конструктор
        Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше.
          Цитата tuchin @
          Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше.


          Сделай вот так
          void AddArraysAmp(int n, const int *pA, const int *pB, const int *pC)
            Не помогло
              Цитата tuchin @
              Не помогло

              А как у тебя вообще передаются указатели на double в функцию, которая требует указатели на int?
                Пробовал и так:
                ExpandedWrap disabled
                  void AddArraysAmp(int n, const double* const pA, const double* const pB, double* const pC)
                  {
                    clock_t start, finish, duration;
                    start = clock();
                    array_view<double, 1> a(n, pA);
                    array_view<double, 1> b(n, pB);
                    array_view<double, 1> c(n, pC);
                    parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)
                    {
                      c[idx] = a[idx] + b[idx];
                    });
                    finish = clock();
                    duration = finish - start;
                    cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета C++ AMP" << endl;
                  }
                   
                  int main()
                  {
                    setlocale(LC_ALL, "");
                    int n = 3;
                    double* pA = (double*) malloc(sizeof(double)*n);
                    double* pB = (double*) malloc(sizeof(double)*n);
                    double* pC = (double*) malloc(sizeof(double)*n);
                    for(int i = 0; i < n; ++i)
                    {
                      pA[i] = (double) i;
                      pB[i] = (double) i;
                      pC[i] = (double) 0;
                    }
                    AddArrays(n, pA, pB, pC);
                    free(pA);
                    free(pB);
                    free(pC);
                    system("\npause");
                  }
                Даже без включения AddArraysAmp в Main возникают те же ошибки. А функция без AMP void AddArrays(int n, const double* const pA, const double* const pB, double* const pC) работает нормально.

                Добавлено
                Кроме того, проверил результаты в Windows 10 и VS2015, результаты те же. При этом определить, что в коде примера не так у меня не получается, ошибку дает только amp.h. А разобраться в коде заголовочного файла Microsoft для меня непосильная задача.
                  Тебе нужен, насколько я понимаю, чтобы вызывался вот этот конструктор array_view (что значит restrict, я не знаю)
                  ExpandedWrap disabled
                    array_view(  
                       int _E0,  
                       const _Value_type * _Src  
                    )restrict(amp,cpu);


                  Т.е. const double *. А у тебя - const double* const.
                  Поэтому компилятор выбирает другой.
                  Сделай параметры const double *pA, ........
                    При int и double в функции
                    ExpandedWrap disabled
                      void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)
                      {
                        clock_t start, finish, duration;
                        start = clock();
                        //array_view<double, 1> a(n, pA);
                        //array_view<double, 1> b(n, pB);
                        //array_view<double, 1> c(n, pC);
                        array_view<int, 1> a(n, pA);
                        array_view<int, 1> b(n, pB);
                        array_view<int, 1> c(n, pC);
                       
                        parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)
                        {
                          c[idx] = a[idx] + b[idx];
                        });
                        finish = clock();
                        duration = finish - start;
                        cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета C++ AMP" << endl;
                      }
                    получил те же результаты
                      Цитата tuchin @
                      //array_view<double, 1> a(n, pA);
                        //array_view<double, 1> b(n, pB);
                        //array_view<double, 1> c(n, pC);

                      Раскоментируй это, а то, что ниже убери
                        ExpandedWrap disabled
                          void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)
                          {
                            clock_t start, finish, duration;
                            start = clock();
                            array_view<double, 1> a(n, pA);
                            array_view<double, 1> b(n, pB);
                            array_view<double, 1> c(n, pC);
                            //array_view<int, 1> a(n, pA);
                            //array_view<int, 1> b(n, pB);
                            //array_view<int, 1> c(n, pC);
                           
                            parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)
                            {
                              c[idx] = a[idx] + b[idx];
                            });
                            finish = clock();
                            duration = finish - start;
                            cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета C++ AMP" << endl;
                          }
                        не помогло
                          Цитата tuchin @
                          array_view<double, 1> a(n, pA)

                          А попробуй сделать array_view<const double, 1>, для a и b
                            Ошибка (активно) выражение должно быть допустимым для изменения левосторонним значением CpuGpuVS2015 e:\MyProgramming\CpuGpuVS2015\CpuGpu.cpp 40
                            Ошибка C3892 Concurrency::array_view<const double,1>::operator []: невозможно присваивать значения переменной, которая объявлена как константа CpuGpuVS2015 e:\myprogramming\cpugpuvs2015\cpugpu.cpp 40
                            Другие ошибки исчезли
                              Покажи код
                                Я забыл убрать const в array_view для c(n, pC). После исправления в программе
                                ExpandedWrap disabled
                                  #include <string>
                                  #include <iostream>
                                  #include <Windows.h>
                                  #include <memory.h>
                                  #include <stdio.h>
                                  #include <time.h>
                                  #include <amp.h>
                                   
                                  using namespace std;
                                  using namespace concurrency;
                                   
                                  void AddArrays(int n, const double* const pA, const double* const pB, double* const pC)
                                  {
                                    clock_t start, finish, duration;
                                    start = clock();
                                    for(int i = 0; i < n; ++i)
                                    {
                                      pC[i] = pA[i] + pB[i];
                                    }
                                    finish = clock();
                                    duration = finish - start;
                                    cout << duration << " - время расчета без OpenMP." << "  Результат: " << pC[2] << endl;
                                  }
                                   
                                  void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)
                                  {
                                    clock_t start, finish, duration;
                                    start = clock();
                                    array_view<const double, 1> a(n, pA);
                                    array_view<const double, 1> b(n, pB);
                                    array_view<double, 1> c(n, pC);
                                    parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)
                                    {
                                      c[idx] = a[idx] + b[idx];
                                    });
                                    finish = clock();
                                    duration = finish - start;
                                    cout << duration << " pC[i] = pA[i] + pB[i]" << " Время расчета C++ AMP" << endl;
                                  }
                                   
                                  int main()
                                  {
                                    setlocale(LC_ALL, "");
                                    int n = 16000;
                                    double* pA = (double*) malloc(sizeof(double)*n);
                                    double* pB = (double*) malloc(sizeof(double)*n);
                                    double* pC = (double*) malloc(sizeof(double)*n);
                                    for(int i = 0; i < n; ++i)
                                    {
                                      pA[i] = (double) i;
                                      pB[i] = (double) i;
                                      pC[i] = (double) 0;
                                    }
                                    AddArrays(n, pA, pB, pC);
                                    AddArraysAmp(n, pA, pB, pC);
                                    free(pA);
                                    free(pB);
                                    free(pC);
                                    system("\npause");
                                  }
                                В результате получаю
                                Возникло необработанное исключение по адресу 0x751524F2 в CpuGpuVS2015.exe: исключение Microsoft C++: Concurrency::runtime_exception по адресу памяти 0x004FE81C.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0504 ]   [ 18 queries used ]   [ Generated: 18.04.24, 23:10 GMT ]