#include <algorithm>
#include <amp.h>
#include <chrono>
#include <iostream>
#include <numeric>
#include <vector>
namespace amp = concurrency;
#define GPU
int main(int argc, char* argv[])
{
unsigned int matrixRank = 8192;
std::vector<int> matrixA(matrixRank*matrixRank, 1);
std::vector<int> matrixB(matrixRank*matrixRank, 0);
std::vector<int> matrixC(matrixRank*matrixRank, 0);
std::iota(matrixB.begin(), matrixB.end(), 0);
amp::extent<2> e(matrixRank, matrixRank);
amp::array_view<int, 2> a(e, matrixA);
amp::array_view<int, 2> b(e, matrixB);
amp::array_view<int, 2> sum(e, matrixC);
auto begin = std::chrono::high_resolution_clock::now();
#ifdef GPU
amp::parallel_for_each(sum.extent, [=](amp::index<2> idx) restrict(amp)
{
sum[idx] = a[idx] + b[idx];
});
sum.synchronize();
#else
for(unsigned int i=0; i<matrixRank*matrixRank; i++)
{
matrixC[i] = matrixA[i] + matrixB[i];
}
#endif
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Computation took: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() << "ms" << std::endl;
std::cin.get();
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGFtcC5oPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dmVjdG9yPgoKbmFtZXNwYWNlIGFtcCA9IGNvbmN1cnJlbmN5OwojZGVmaW5lIEdQVQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgdW5zaWduZWQgaW50IG1hdHJpeFJhbmsgPSA4MTkyOwoJc3RkOjp2ZWN0b3I8aW50PiBtYXRyaXhBKG1hdHJpeFJhbmsqbWF0cml4UmFuaywgMSk7CglzdGQ6OnZlY3RvcjxpbnQ+IG1hdHJpeEIobWF0cml4UmFuayptYXRyaXhSYW5rLCAwKTsKCXN0ZDo6dmVjdG9yPGludD4gbWF0cml4QyhtYXRyaXhSYW5rKm1hdHJpeFJhbmssIDApOwoJc3RkOjppb3RhKG1hdHJpeEIuYmVnaW4oKSwgbWF0cml4Qi5lbmQoKSwgMCk7CgoJYW1wOjpleHRlbnQ8Mj4gZShtYXRyaXhSYW5rLCBtYXRyaXhSYW5rKTsKCWFtcDo6YXJyYXlfdmlldzxpbnQsIDI+IGEoZSwgbWF0cml4QSk7CglhbXA6OmFycmF5X3ZpZXc8aW50LCAyPiBiKGUsIG1hdHJpeEIpOwoJYW1wOjphcnJheV92aWV3PGludCwgMj4gc3VtKGUsIG1hdHJpeEMpOwoKCWF1dG8gYmVnaW4gPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKI2lmZGVmIEdQVQoJYW1wOjpwYXJhbGxlbF9mb3JfZWFjaChzdW0uZXh0ZW50LCBbPV0oYW1wOjppbmRleDwyPiBpZHgpIHJlc3RyaWN0KGFtcCkKCXsKCQlzdW1baWR4XSA9IGFbaWR4XSArIGJbaWR4XTsKCX0pOwoJc3VtLnN5bmNocm9uaXplKCk7CiNlbHNlCglmb3IodW5zaWduZWQgaW50IGk9MDsgaTxtYXRyaXhSYW5rKm1hdHJpeFJhbms7IGkrKykKCXsKCQltYXRyaXhDW2ldID0gbWF0cml4QVtpXSArIG1hdHJpeEJbaV07Cgl9CiNlbmRpZgoJYXV0byBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCXN0ZDo6Y291dCA8PCAiQ29tcHV0YXRpb24gdG9vazogIiA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBiZWdpbikuY291bnQoKSA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKCglzdGQ6OmNpbi5nZXQoKTsKCXJldHVybiAwOwp9