VS2017搭載C++AMP並行計算平臺出現"_Access":找不到標識符問題解決,並實現基於C++的AMP並行計算和CPU計算測試

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用時會節約幾十倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章