
#include <cstdio>
#include <cstdlib>
#include "timer.h"
#include <hip/hip_runtime.h>
global void init(float *x, int N)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < N) {
x[i] = 2.0;
}
}
global void calculate(float *x, float *y, float a,
float b, float c, int N)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < N) {
y[i] = a * x[i] * x[i] + b * x[i] + c;
}
}
int main()
{
int N = 256 * 1024 * 1024; // 数组长度256M
int size = N * sizeof(float); // 内存空间1GB
// 分配内存空间
float *y = (float *) malloc(size);
float *dx, *dy;
hipMalloc(&dx, size);
hipMalloc(&dy, size);
// 计时器
my_timer timer;
double t_init = 0.0;
double t_calc = 0.0;
double t_chck = 0.0;
// 初始化a,b,c
float a = 2.5, b = 2.0, c = 1.0;
// 循环8次完成
for (int j = 0; j < 8; j++) {
// 初始化x
int blockSize = 256;
int numBlocks = (N + blockSize - 1) / blockSize;
timer.start();
init<<<numBlocks, blockSize>>>(dx,N);
timer.stop();
t_init += timer.dt;
// 计算y = ax^2 + bx + c;
timer.start();
calculate<<<numBlocks, blockSize>>>(dx,dy,a,b,c,N);
timer.stop();
t_calc += timer.dt;
// 检查结果
timer.start();
bool correct = true;
hipMemcpy(y, dy, size, hipMemcpyDeviceToHost);
for (int i = 0; i < N; i++) {
if (y[i] != 15.0) {
correct = false;
break;
}
}
if (correct) {
printf("Loop %d: Correct results.\n", j+1);
} else {
printf("Loop %d: Wrong results.\n", j+1);
}
timer.stop();
t_chck += timer.dt;
}
printf("Initialization took %8.3f ms.\n", t_init);
printf("Calculation took %8.3f ms.\n", t_calc);
printf("Validation took %8.3f ms.\n", t_chck);
// 释放空间
hipFree(dx);
hipFree(dy);
free(y);
return 0;
}

暂无数据
可以加载gcc7.3.1版本,module add compiler/devtoolset/7.3.1
# pwd
/public/software/compiler/gcc-7.3.1
# find -iname cmath*
./usr/include/c++/7/cmath
./usr/include/c++/7/ext/cmath
./usr/include/c++/7/tr1/cmath
# export CPATH=$CPATH:/public/software/compiler/gcc-7.3.1/usr/include/c++/7
这样试一下