#include <amp.h>
#include <chrono>
#include <iostream>
#include <numeric>
#include <vector>
using namespace concurrency;
#define MAT_RANK 1024
#define GPU
void multMatrixCPU(std::vector<int>& matA, std::vector<int>& matB, std::vector<int>& out)
{
for(unsigned int i=0; i<MAT_RANK; i++)
{
for(unsigned int j=0; j<MAT_RANK; j++)
{
int sum = 0;
for(unsigned int k=0; k<MAT_RANK; k++)
{
sum += matA[i*MAT_RANK + k]*matB[k*MAT_RANK + j];
}
out[i*MAT_RANK + j] = sum;
}
}
}
void multMatrixGPU(std::vector<int>& matA, std::vector<int>& matB, std::vector<int>& out)
{
array_view<const int, 2> inA(MAT_RANK, MAT_RANK, matA);
array_view<const int, 2> inB(MAT_RANK, MAT_RANK, matB);
array_view<int, 2> res(MAT_RANK, MAT_RANK, out);
res.discard_data();
parallel_for_each(res.extent, [=](index<2> idx) restrict(amp) {
int i = idx[0];
int j = idx[1];
int sum = 0;
for(unsigned int k=0; k<MAT_RANK; k++)
{
sum += inA(i, k)*inB(k, j);
}
res(idx) = sum;
});
}
#include <wheels/stopwatch.h++>
int main(int argc, char* argv[])
{
std::vector<int> matA(MAT_RANK*MAT_RANK, 0);
std::vector<int> matB(MAT_RANK*MAT_RANK, 0);
std::vector<int> matC(MAT_RANK*MAT_RANK, 0);
std::iota(matA.begin(), matA.end(), 0);
std::iota(matB.begin(), matB.end(), 0);
accelerator acc;
std::wcout << "Device #:" << std::endl;
std::wcout << "Desc:\t" << acc.get_description() << std::endl;
std::wcout << "Path:\t" << acc.get_device_path() << std::endl;
std::wcout << "Mem:\t" << acc.get_dedicated_memory() << std::endl;
std::wcout << "Vers:\t" << (acc.get_version() >> 16) << '.' << (acc.get_version() & 0xFFFF) << std::endl;
std::wcout << "IsEmu:\t" << acc.is_emulated << std::endl;
std::wcout << std::endl;
wheels::stopwatch sw;
#ifdef GPU
multMatrixGPU(matA, matB, matC);
#else
multMatrixCPU(matA, matB, matC);
#endif
auto time = sw.elapsed();
std::cout << "Process time: " << wheels::to_milliseconds(time) << " ms" << std::endl;
system("pause");
return 0;
}
I2luY2x1ZGUgPGFtcC5oPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIGNvbmN1cnJlbmN5OwoKI2RlZmluZSBNQVRfUkFOSyAxMDI0CiNkZWZpbmUgR1BVCgp2b2lkIG11bHRNYXRyaXhDUFUoc3RkOjp2ZWN0b3I8aW50PiYgbWF0QSwgc3RkOjp2ZWN0b3I8aW50PiYgbWF0Qiwgc3RkOjp2ZWN0b3I8aW50PiYgb3V0KQp7Cglmb3IodW5zaWduZWQgaW50IGk9MDsgaTxNQVRfUkFOSzsgaSsrKQoJewoJCWZvcih1bnNpZ25lZCBpbnQgaj0wOyBqPE1BVF9SQU5LOyBqKyspCgkJewoJCQlpbnQgc3VtID0gMDsKCQkJZm9yKHVuc2lnbmVkIGludCBrPTA7IGs8TUFUX1JBTks7IGsrKykKCQkJewoJCQkJc3VtICs9IG1hdEFbaSpNQVRfUkFOSyArIGtdKm1hdEJbaypNQVRfUkFOSyArIGpdOwoJCQl9CgkJCW91dFtpKk1BVF9SQU5LICsgal0gPSBzdW07CgkJfQoJfQp9Cgp2b2lkIG11bHRNYXRyaXhHUFUoc3RkOjp2ZWN0b3I8aW50PiYgbWF0QSwgc3RkOjp2ZWN0b3I8aW50PiYgbWF0Qiwgc3RkOjp2ZWN0b3I8aW50PiYgb3V0KQp7CglhcnJheV92aWV3PGNvbnN0IGludCwgMj4gaW5BKE1BVF9SQU5LLCBNQVRfUkFOSywgbWF0QSk7CglhcnJheV92aWV3PGNvbnN0IGludCwgMj4gaW5CKE1BVF9SQU5LLCBNQVRfUkFOSywgbWF0Qik7CglhcnJheV92aWV3PGludCwgMj4gcmVzKE1BVF9SQU5LLCBNQVRfUkFOSywgb3V0KTsKCXJlcy5kaXNjYXJkX2RhdGEoKTsKCglwYXJhbGxlbF9mb3JfZWFjaChyZXMuZXh0ZW50LCBbPV0oaW5kZXg8Mj4gaWR4KSByZXN0cmljdChhbXApIHsKCQlpbnQgaSA9IGlkeFswXTsKCQlpbnQgaiA9IGlkeFsxXTsKCQlpbnQgc3VtID0gMDsKCQlmb3IodW5zaWduZWQgaW50IGs9MDsgazxNQVRfUkFOSzsgaysrKQoJCXsKCQkJc3VtICs9IGluQShpLCBrKSppbkIoaywgaik7CgkJfQoJCXJlcyhpZHgpID0gc3VtOwoJfSk7Cn0KCiNpbmNsdWRlIDx3aGVlbHMvc3RvcHdhdGNoLmgrKz4KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKCXN0ZDo6dmVjdG9yPGludD4gbWF0QShNQVRfUkFOSypNQVRfUkFOSywgMCk7CglzdGQ6OnZlY3RvcjxpbnQ+IG1hdEIoTUFUX1JBTksqTUFUX1JBTkssIDApOwoJc3RkOjp2ZWN0b3I8aW50PiBtYXRDKE1BVF9SQU5LKk1BVF9SQU5LLCAwKTsKCglzdGQ6OmlvdGEobWF0QS5iZWdpbigpLCBtYXRBLmVuZCgpLCAwKTsKCXN0ZDo6aW90YShtYXRCLmJlZ2luKCksIG1hdEIuZW5kKCksIDApOwoKCWFjY2VsZXJhdG9yIGFjYzsKCXN0ZDo6d2NvdXQgPDwgIkRldmljZSAjOiIgPDwgc3RkOjplbmRsOwoJc3RkOjp3Y291dCA8PCAiRGVzYzpcdCIgPDwgYWNjLmdldF9kZXNjcmlwdGlvbigpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6d2NvdXQgPDwgIlBhdGg6XHQiIDw8IGFjYy5nZXRfZGV2aWNlX3BhdGgoKSA8PCBzdGQ6OmVuZGw7CglzdGQ6Ondjb3V0IDw8ICJNZW06XHQiIDw8IGFjYy5nZXRfZGVkaWNhdGVkX21lbW9yeSgpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6d2NvdXQgPDwgIlZlcnM6XHQiIDw8IChhY2MuZ2V0X3ZlcnNpb24oKSA+PiAxNikgPDwgJy4nIDw8IChhY2MuZ2V0X3ZlcnNpb24oKSAmIDB4RkZGRikgPDwgc3RkOjplbmRsOwoJc3RkOjp3Y291dCA8PCAiSXNFbXU6XHQiIDw8IGFjYy5pc19lbXVsYXRlZCA8PCBzdGQ6OmVuZGw7CglzdGQ6Ondjb3V0IDw8IHN0ZDo6ZW5kbDsKCgl3aGVlbHM6OnN0b3B3YXRjaCBzdzsKI2lmZGVmIEdQVQoJbXVsdE1hdHJpeEdQVShtYXRBLCBtYXRCLCBtYXRDKTsKI2Vsc2UKCW11bHRNYXRyaXhDUFUobWF0QSwgbWF0QiwgbWF0Qyk7CiNlbmRpZgoJYXV0byB0aW1lID0gc3cuZWxhcHNlZCgpOwoJc3RkOjpjb3V0IDw8ICJQcm9jZXNzIHRpbWU6ICIgPDwgd2hlZWxzOjp0b19taWxsaXNlY29uZHModGltZSkgPDwgIiBtcyIgPDwgc3RkOjplbmRsOwoKCXN5c3RlbSgicGF1c2UiKTsKCXJldHVybiAwOwp9