1
运行时
请教大家DCU上的线性代数测试
2022-06-07 17:37:48
246

大家好!

最近我们需要在DCU上做dgemm和dsyev(d)等线性代数的操作,尝试了Roc blas,Roc Solver和自己编译的magma 2.6.2的HIP版,发现:

  1. 用magma做dsyevd时,第一次调用dsyevd的耗时非常长,比如做1024矩阵的对角化,需要返回本征向量时,第一次调用需要21.25s,后面则只需1.20s;
  2. 用Rocblas做dgemm时,同样会出现第一次耗时长的问题,而用magma做dgemm则不存在该问题;
  3. 用RocSolver做dsyev总是报错,不成功。

请教大家这些问题该如何解决?

全部评论(13)
只看楼主
W
wangqingwei
2楼

问题3,我复现了这个问题:调用rocsolver_dsyev接口成功,但是memcpy拷贝结果时出错,invalid address access。
原因是,info参数不是device端变量,请看一下你是否也是这个问题。

2022/6/18
G
ghfund_1_a25
回复 @wangqingwei

对,Info那里我确实没看清,弄成host端的了。

但是出现了新错误“slurmstepd: error: Detected 1 oom-kill event(s) in step 20788250.batch cgroup. Some of your processes may have been killed by the cgroup out-of-memory handler.”

2022/6/21
Z
zhaohongpeng
回复 @wangqingwei

这个看着像是oom导致的错误,可以进一步定位一下,是哪个接口出错了。

2022/6/24
H
hanmzh_kunshan
1楼

1)DCU确实会存在第一次调用时间长较长的现象
2)Rocblas确实存在第一次做dgemm时间较长的现象
3)请贴一下具体的报错,RocSolver目前的接口实现并不完全,请使用最新的版本。

2022/6/8
G
ghfund_1_a25
回复 @hanmzh_kunshan

使用的是最新的DTK 22.04.1 里面自带的RocSolver.
给出的具体报错信息是:
Invalid address access: 0x7ffdb556d000, Error code: 3.
后面就退出了.

第一次调用时间长的问题将来可能解决吗?

使用magma_dsyev第一次调用耗时信息是:
time dsytrd = 0.67
time dstedx = 19.66
time dormtr + copy = 0.47
后面几次调用则是:
time dsytrd = 0.68
time dstedx = 0.40
time dormtr + copy = 0.11
这个可能原因是什么呢?

2022/6/8
Z
zhaohongpeng
回复 @hanmzh_kunshan

可以给一下入参信息吗?如果可以,可以贴一下dsyev您这边的相关调用代码吗?(包括句柄创建、资源分配以及API调用相关的代码)

2022/6/10
G
ghfund_1_a25
回复 @hanmzh_kunshan

先对rocsolver_dsyev做了个封装:

extern "C" int WRAPPER_ROC_SOLVER_DSYEV
(rocblas_handle handle, int *pn, double *a, double *d, int *info)
{
int status;
int n = *pn;
double *da, *dd, de;
hipMalloc(&da, n
nsizeof(double));
hipMalloc(&dd, n
nsizeof(double));
hipMalloc(&de, n
n*sizeof(double));

rocblas_evect evect;
evect = rocblas_evect_original;

rocblas_fill uplo;
uplo = rocblas_fill_lower;

int lda = n;

hipMemcpy(da,a,n*n*sizeof(double),hipMemcpyHostToDevice);

status = rocsolver_dsyev(handle,evect,uplo,n,da,lda,dd,de,info);

hipMemcpy(a,da,n*n*sizeof(double),hipMemcpyDeviceToHost);
hipMemcpy(d,dd,n*sizeof(double),hipMemcpyDeviceToHost);

hipFree(da);
hipFree(dd);
hipFree(de);

return status;

}

然后调用
rocblas_handle handle;
int NDim;
int info;

    MSize = NDim*NDim*sizeof(double);
hA = (double *) malloc(MSize);
hB = (double *) malloc(MSize);

WRAPPER_ROC_SOLVER_DSYEV(handle,&NDim,hA,hB,&info);

不知是不是我没调用对。

2022/6/14
全部9条回复
没有更多内容了
--
楼主
Level.1
0 帖子
楼主热帖
暂无数据