amp.h關於出現如下問題解決辦法
amp.h第2616和3462行代碼:
_Value_type& operator() (const index<_Rank>& _Index) const __GPU
{
void * _Ptr = _Access(_Read_write_access, _Index);//第2626和3462行代碼
return *reinterpret_cast<_Value_type*>(_Ptr);
}
修改後:
_Value_type& operator() (const index<_Rank>& _Index) const __GPU
{
void * _Ptr = this->_Access(_Read_write_access, _Index);//加個this->都修改
return *reinterpret_cast<_Value_type*>(_Ptr);
}
基於C++的AMP並行計算和cpu計算測試代碼:
#include <amp.h>
#include <iostream>
#include <vector>
using namespace Concurrency;
#define test 3.14159265358;
const int n_size = 10000000;//循環次數
using namespace std;
//GPU計算
void GPU_Computing(vector<double> vec)
{
clock_t startTime, endTime;
startTime = clock(); //計時開始
vector<double> resultVec;
resultVec.resize(n_size);
array_view<const double, 1> array1(n_size, vec);
array_view<const double, 1> array2(n_size, vec);
array_view<double, 1> result(n_size, resultVec);
//GPU計算部分
parallel_for_each(result.extent, [=](index<1> idx) restrict(amp)
{
result[idx] = array1[idx] * array1[idx] * array2[idx] / array2[idx];
});
endTime = clock(); //計時開始
cout << "GPU Use Time:" << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
//CPU計算
void CPU_Computing(vector<double> vec)
{
clock_t startTime, endTime;
startTime = clock(); //計時開始
vector<double> result;
result.resize(n_size);
for (size_t i = 0; i < n_size; i++)
{
result[i] = vec[i] * vec[i] * vec[i] / vec[i];
}
endTime = clock(); //計時開始
cout << "CPU Use Time:" << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
int main()
{
double num_test = test;
vector<double> nums;
for (size_t i = 0; i < n_size; i++)
{
nums.push_back(num_test);//賦予測試數
}
GPU_Computing(nums);
CPU_Computing(nums);
cout << "測試完畢。" << "\n";
}
1000萬大小的數組測試用時對比:
500萬數組測試大小的數組測試用時對比:
100萬數組測試大小的數組測試用時對比:
10萬數組測試大小的數組測試用時對比:
在循環數量過少的情況下,例如少於10w次循環下,CPU執行速度會比GPU執行速度快。原因可能在於GPU獲取數據有固定時間消耗,無法像CPU一樣直接調度數據總線。因此會產生在循環數量很多時,CPU和GPU的差異才會被拉開,當1000w次循環下,GPU用時會節約幾十倍。