Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.165.246] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Теперь пытаюсь поработать с C++ AMP. Windows 7, VS 2012. В программе из книги C++ AMP
#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) |
Сообщ.
#2
,
|
|
|
Скорее всего, где-то требуется std::vector, вместо указателя
Добавлено Либо какой-то из массивов apm Добавлено Цитата Олег М @ array_view<int, 1> a(n, pA); Здесь требуется обычный указатель, а ты передаёшь константный, она не может найти конструктор |
Сообщ.
#3
,
|
|
|
Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше.
|
Сообщ.
#4
,
|
|
|
Цитата tuchin @ Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше. Сделай вот так void AddArraysAmp(int n, const int *pA, const int *pB, const int *pC) |
Сообщ.
#5
,
|
|
|
Не помогло
|
Сообщ.
#6
,
|
|
|
Цитата tuchin @ Не помогло А как у тебя вообще передаются указатели на double в функцию, которая требует указатели на int? |
Сообщ.
#7
,
|
|
|
Пробовал и так:
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"); } Добавлено Кроме того, проверил результаты в Windows 10 и VS2015, результаты те же. При этом определить, что в коде примера не так у меня не получается, ошибку дает только amp.h. А разобраться в коде заголовочного файла Microsoft для меня непосильная задача. |
Сообщ.
#8
,
|
|
|
Тебе нужен, насколько я понимаю, чтобы вызывался вот этот конструктор array_view (что значит restrict, я не знаю)
array_view( int _E0, const _Value_type * _Src )restrict(amp,cpu); Т.е. const double *. А у тебя - const double* const. Поэтому компилятор выбирает другой. Сделай параметры const double *pA, ........ |
Сообщ.
#9
,
|
|
|
При int и double в функции
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; } |
Сообщ.
#10
,
|
|
|
Цитата tuchin @ //array_view<double, 1> a(n, pA); //array_view<double, 1> b(n, pB); //array_view<double, 1> c(n, pC); Раскоментируй это, а то, что ниже убери |
Сообщ.
#11
,
|
|
|
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; } |
Сообщ.
#12
,
|
|
|
Цитата tuchin @ array_view<double, 1> a(n, pA) А попробуй сделать array_view<const double, 1>, для a и b |
Сообщ.
#13
,
|
|
|
Ошибка (активно) выражение должно быть допустимым для изменения левосторонним значением CpuGpuVS2015 e:\MyProgramming\CpuGpuVS2015\CpuGpu.cpp 40
Ошибка C3892 Concurrency::array_view<const double,1>::operator []: невозможно присваивать значения переменной, которая объявлена как константа CpuGpuVS2015 e:\myprogramming\cpugpuvs2015\cpugpu.cpp 40 Другие ошибки исчезли |
Сообщ.
#14
,
|
|
|
Покажи код
|
Сообщ.
#15
,
|
|
|
Я забыл убрать const в array_view для c(n, pC). После исправления в программе
#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. |