定义测试的数据大小 #define DATASIZE 100000000 float * fArr = new float[DATASIZE]; for (int i = 0; i < DATASIZE; i++) { fArr[i] = i; } 1、 for代码(常规写法) for (int i = 0; i < DATASIZE; i++) { for (int j = 0; j < 10; j++) { fArr[i] = fArr[i] * fArr[i]; } } 计算时间在5S左右。 2、 用AMP 方式的GPU 技术 #include <amp.h> using namespace concurrency; void Square_array(float* arr, int n) { array_view<float, 1> dataView(n, &arr[0]); parallel_for_each(dataView.extent, [=](index<1> idx) restrict(amp) { dataView[idx] = dataView[idx] * dataView[idx]; }); // Copy data from GPU to CPU dataView.synchronize(); } for (int j = 0; j < 10; j++) { Square_array(fArr, DATASIZE); } 计算时间在4S左右。 3、 用OpenMP 并行技术 启用OpenMP功能 #include<omp.h> #pragma omp parallel for for (int i = 0; i < DATASIZE; i++) { for (int j = 0; j < 10; j++) { fArr[i] = fArr[i] * fArr[i]; } }
计算时间在800—1800ms 左右
经测试,OPENMP 会带来3-7倍的效率提升。