Skip to content

Commit de04571

Browse files
authored
[SYCLomatic #912#1025] Add tests for the new migrated 15 cusolver API and 2 types (#328)
Signed-off-by: Jiang, Zhiwei <[email protected]>
1 parent 512f083 commit de04571

File tree

9 files changed

+1455
-22
lines changed

9 files changed

+1455
-22
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<test driverID="test_feature" name="TEMPLATE">
4+
<description>test</description>
5+
<files>
6+
<file path="feature_case/cusolver/${testName}.cu" />
7+
</files>
8+
<rules>
9+
<platformRule OSFamily="Linux" kit="CUDA11.4" kitRange="OLDER" runOnThisPlatform="false"/>
10+
<platformRule OSFamily="Windows" kit="CUDA11.4" kitRange="OLDER" runOnThisPlatform="false"/>
11+
<optlevelRule GPUFeature="NOT double" excludeOptlevelNameString="gpu" />
12+
</rules>
13+
</test>

features/feature_case/cusolver/cusolver_test2.cu

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,12 +375,98 @@ void test_cusolverDnTgesvdj() {
375375
}
376376
}
377377

378+
void test_cusolverDnTsyevj_cusolverDnTheevj() {
379+
std::vector<float> a = {1, 2, 2, 4};
380+
Data<float> a_s(a.data(), 4);
381+
Data<double> a_d(a.data(), 4);
382+
Data<float2> a_c(a.data(), 4);
383+
Data<double2> a_z(a.data(), 4);
384+
Data<float> w_s(2);
385+
Data<double> w_d(2);
386+
Data<float> w_c(2);
387+
Data<double> w_z(2);
388+
389+
cusolverDnHandle_t handle;
390+
cusolverDnCreate(&handle);
391+
392+
a_s.H2D();
393+
a_d.H2D();
394+
a_c.H2D();
395+
a_z.H2D();
396+
397+
syevjInfo_t params;
398+
cusolverDnCreateSyevjInfo(&params);
399+
400+
int lwork_s;
401+
int lwork_d;
402+
int lwork_c;
403+
int lwork_z;
404+
405+
cusolverDnSsyevj_bufferSize(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_s.d_data, 2, w_s.d_data, &lwork_s, params);
406+
cusolverDnDsyevj_bufferSize(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_d.d_data, 2, w_d.d_data, &lwork_d, params);
407+
cusolverDnCheevj_bufferSize(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_c.d_data, 2, w_c.d_data, &lwork_c, params);
408+
cusolverDnZheevj_bufferSize(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_z.d_data, 2, w_z.d_data, &lwork_z, params);
409+
410+
float* device_ws_s;
411+
double* device_ws_d;
412+
float2* device_ws_c;
413+
double2* device_ws_z;
414+
cudaMalloc(&device_ws_s, lwork_s * sizeof(float));
415+
cudaMalloc(&device_ws_d, lwork_d * sizeof(double));
416+
cudaMalloc(&device_ws_c, lwork_c * sizeof(float2));
417+
cudaMalloc(&device_ws_z, lwork_z * sizeof(double2));
418+
419+
int *info;
420+
cudaMalloc(&info, sizeof(int));
421+
422+
cusolverDnSsyevj(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_s.d_data, 2, w_s.d_data, device_ws_s, lwork_s, info, params);
423+
cusolverDnDsyevj(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_d.d_data, 2, w_d.d_data, device_ws_d, lwork_d, info, params);
424+
cusolverDnCheevj(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_c.d_data, 2, w_c.d_data, device_ws_c, lwork_c, info, params);
425+
cusolverDnZheevj(handle, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, a_z.d_data, 2, w_z.d_data, device_ws_z, lwork_z, info, params);
426+
427+
a_s.D2H();
428+
a_d.D2H();
429+
a_c.D2H();
430+
a_z.D2H();
431+
w_s.D2H();
432+
w_d.D2H();
433+
w_c.D2H();
434+
w_z.D2H();
435+
436+
cudaStreamSynchronize(0);
437+
438+
cusolverDnDestroySyevjInfo(params);
439+
cusolverDnDestroy(handle);
440+
cudaFree(device_ws_s);
441+
cudaFree(device_ws_d);
442+
cudaFree(device_ws_c);
443+
cudaFree(device_ws_z);
444+
cudaFree(info);
445+
446+
float expect_a[4] = {-0.894427,0.447214,0.447214,0.894427};
447+
float expect_w[2] = {0.000000,5.000000};
448+
if (compare_result(expect_a, a_s.h_data, 4) &&
449+
compare_result(expect_a, a_d.h_data, 4) &&
450+
compare_result(expect_a, a_c.h_data, 4) &&
451+
compare_result(expect_a, a_z.h_data, 4) &&
452+
compare_result(expect_w, w_s.h_data, 2) &&
453+
compare_result(expect_w, w_d.h_data, 2) &&
454+
compare_result(expect_w, w_c.h_data, 2) &&
455+
compare_result(expect_w, w_z.h_data, 2))
456+
printf("DnTsyevj/DnCheevj pass\n");
457+
else {
458+
printf("DnTsyevj/DnCheevj fail\n");
459+
test_passed = false;
460+
}
461+
}
462+
378463
int main() {
379464
#ifndef DPCT_USM_LEVEL_NONE
380465
test_cusolverDnTpotrfBatched();
381466
test_cusolverDnTpotrsBatched();
382467
#endif
383468
test_cusolverDnTgesvdj();
469+
test_cusolverDnTsyevj_cusolverDnTheevj();
384470

385471
if (test_passed)
386472
return 0;

features/feature_case/cusolver/cusolver_test3.cu

Lines changed: 197 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,10 +1316,6 @@ void test_cusolverDnSyevdx() {
13161316
cudaFree(device_ws_z);
13171317
cudaFree(info);
13181318

1319-
printf("a_s:%f,%f,%f,%f\n", a_s.h_data[0], a_s.h_data[1], a_s.h_data[2], a_s.h_data[3]);
1320-
printf("h_meig_s:%ld\n", h_meig_s);
1321-
printf("w_s:%f,%f\n", w_s.h_data[0], w_s.h_data[1]);
1322-
13231319
float expect_a[4] = {0.894427,-0.447214,0.447214,0.894427};
13241320
int64_t expect_h_meig = 2;
13251321
float expect_w[2] = {0.000000,5.000000};
@@ -1435,10 +1431,6 @@ void test_cusolverDnXsyevdx() {
14351431
free(host_ws_z);
14361432
cudaFree(info);
14371433

1438-
printf("a_s:%f,%f,%f,%f\n", a_s.h_data[0], a_s.h_data[1], a_s.h_data[2], a_s.h_data[3]);
1439-
printf("h_meig_s:%ld\n", h_meig_s);
1440-
printf("w_s:%f,%f\n", w_s.h_data[0], w_s.h_data[1]);
1441-
14421434
float expect_a[4] = {0.894427,-0.447214,0.447214,0.894427};
14431435
int64_t expect_h_meig = 2;
14441436
float expect_w[2] = {0.000000,5.000000};
@@ -1461,6 +1453,200 @@ void test_cusolverDnXsyevdx() {
14611453
}
14621454
}
14631455

1456+
void test_cusolverDnXsyevd() {
1457+
std::vector<float> a = {1, 2, 2, 4};
1458+
Data<float> a_s(a.data(), 4);
1459+
Data<double> a_d(a.data(), 4);
1460+
Data<float2> a_c(a.data(), 4);
1461+
Data<double2> a_z(a.data(), 4);
1462+
Data<float> w_s(2);
1463+
Data<double> w_d(2);
1464+
Data<float> w_c(2);
1465+
Data<double> w_z(2);
1466+
1467+
cusolverDnHandle_t handle;
1468+
cusolverDnCreate(&handle);
1469+
1470+
a_s.H2D();
1471+
a_d.H2D();
1472+
a_c.H2D();
1473+
a_z.H2D();
1474+
1475+
cusolverDnParams_t params;
1476+
cusolverDnCreateParams(&params);
1477+
1478+
size_t lwork_s;
1479+
size_t lwork_d;
1480+
size_t lwork_c;
1481+
size_t lwork_z;
1482+
size_t lwork_host_s;
1483+
size_t lwork_host_d;
1484+
size_t lwork_host_c;
1485+
size_t lwork_host_z;
1486+
1487+
cusolverDnXsyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_32F, a_s.d_data, 2, CUDA_R_32F, w_s.d_data, CUDA_R_32F, &lwork_s, &lwork_host_s);
1488+
cusolverDnXsyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_64F, a_d.d_data, 2, CUDA_R_64F, w_d.d_data, CUDA_R_64F, &lwork_d, &lwork_host_d);
1489+
cusolverDnXsyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_32F, a_c.d_data, 2, CUDA_R_32F, w_c.d_data, CUDA_C_32F, &lwork_c, &lwork_host_c);
1490+
cusolverDnXsyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_64F, a_z.d_data, 2, CUDA_R_64F, w_z.d_data, CUDA_C_64F, &lwork_z, &lwork_host_z);
1491+
1492+
void* device_ws_s;
1493+
void* device_ws_d;
1494+
void* device_ws_c;
1495+
void* device_ws_z;
1496+
cudaMalloc(&device_ws_s, lwork_s);
1497+
cudaMalloc(&device_ws_d, lwork_d);
1498+
cudaMalloc(&device_ws_c, lwork_c);
1499+
cudaMalloc(&device_ws_z, lwork_z);
1500+
void* host_ws_s;
1501+
void* host_ws_d;
1502+
void* host_ws_c;
1503+
void* host_ws_z;
1504+
host_ws_s = malloc(lwork_host_s);
1505+
host_ws_d = malloc(lwork_host_d);
1506+
host_ws_c = malloc(lwork_host_c);
1507+
host_ws_z = malloc(lwork_host_z);
1508+
1509+
int *info;
1510+
cudaMalloc(&info, sizeof(int));
1511+
1512+
cusolverDnXsyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_32F, a_s.d_data, 2, CUDA_R_32F, w_s.d_data, CUDA_R_32F, device_ws_s, lwork_s, host_ws_s, lwork_host_s, info);
1513+
cusolverDnXsyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_64F, a_d.d_data, 2, CUDA_R_64F, w_d.d_data, CUDA_R_64F, device_ws_d, lwork_d, host_ws_d, lwork_host_d, info);
1514+
cusolverDnXsyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_32F, a_c.d_data, 2, CUDA_R_32F, w_c.d_data, CUDA_C_32F, device_ws_c, lwork_c, host_ws_c, lwork_host_c, info);
1515+
cusolverDnXsyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_64F, a_z.d_data, 2, CUDA_R_64F, w_z.d_data, CUDA_C_64F, device_ws_z, lwork_z, host_ws_z, lwork_host_z, info);
1516+
1517+
a_s.D2H();
1518+
a_d.D2H();
1519+
a_c.D2H();
1520+
a_z.D2H();
1521+
w_s.D2H();
1522+
w_d.D2H();
1523+
w_c.D2H();
1524+
w_z.D2H();
1525+
1526+
cudaStreamSynchronize(0);
1527+
1528+
cusolverDnDestroyParams(params);
1529+
cusolverDnDestroy(handle);
1530+
cudaFree(device_ws_s);
1531+
cudaFree(device_ws_d);
1532+
cudaFree(device_ws_c);
1533+
cudaFree(device_ws_z);
1534+
free(host_ws_s);
1535+
free(host_ws_d);
1536+
free(host_ws_c);
1537+
free(host_ws_z);
1538+
cudaFree(info);
1539+
1540+
float expect_a[4] = {-0.894427,0.447214,0.447214,0.894427};
1541+
float expect_w[2] = {0.000000,5.000000};
1542+
if (compare_result(expect_a, a_s.h_data, 4) &&
1543+
compare_result(expect_a, a_d.h_data, 4) &&
1544+
compare_result(expect_a, a_c.h_data, 4) &&
1545+
compare_result(expect_a, a_z.h_data, 4) &&
1546+
compare_result(expect_w, w_s.h_data, 2) &&
1547+
compare_result(expect_w, w_d.h_data, 2) &&
1548+
compare_result(expect_w, w_c.h_data, 2) &&
1549+
compare_result(expect_w, w_z.h_data, 2))
1550+
printf("DnXsyevd pass\n");
1551+
else {
1552+
printf("DnXsyevd fail\n");
1553+
test_passed = false;
1554+
}
1555+
}
1556+
1557+
void test_cusolverDnSyevd() {
1558+
std::vector<float> a = {1, 2, 2, 4};
1559+
Data<float> a_s(a.data(), 4);
1560+
Data<double> a_d(a.data(), 4);
1561+
Data<float2> a_c(a.data(), 4);
1562+
Data<double2> a_z(a.data(), 4);
1563+
Data<float> w_s(2);
1564+
Data<double> w_d(2);
1565+
Data<float> w_c(2);
1566+
Data<double> w_z(2);
1567+
1568+
cusolverDnHandle_t handle;
1569+
cusolverDnCreate(&handle);
1570+
1571+
a_s.H2D();
1572+
a_d.H2D();
1573+
a_c.H2D();
1574+
a_z.H2D();
1575+
1576+
cusolverDnParams_t params;
1577+
cusolverDnCreateParams(&params);
1578+
1579+
size_t lwork_s;
1580+
size_t lwork_d;
1581+
size_t lwork_c;
1582+
size_t lwork_z;
1583+
1584+
cusolverDnSyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_32F, a_s.d_data, 2, CUDA_R_32F, w_s.d_data, CUDA_R_32F, &lwork_s);
1585+
cusolverDnSyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_64F, a_d.d_data, 2, CUDA_R_64F, w_d.d_data, CUDA_R_64F, &lwork_d);
1586+
cusolverDnSyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_32F, a_c.d_data, 2, CUDA_R_32F, w_c.d_data, CUDA_C_32F, &lwork_c);
1587+
cusolverDnSyevd_bufferSize(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_64F, a_z.d_data, 2, CUDA_R_64F, w_z.d_data, CUDA_C_64F, &lwork_z);
1588+
1589+
void* device_ws_s;
1590+
void* device_ws_d;
1591+
void* device_ws_c;
1592+
void* device_ws_z;
1593+
cudaMalloc(&device_ws_s, lwork_s);
1594+
cudaMalloc(&device_ws_d, lwork_d);
1595+
cudaMalloc(&device_ws_c, lwork_c);
1596+
cudaMalloc(&device_ws_z, lwork_z);
1597+
1598+
int *info;
1599+
cudaMalloc(&info, sizeof(int));
1600+
1601+
cusolverDnSyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_32F, a_s.d_data, 2, CUDA_R_32F, w_s.d_data, CUDA_R_32F, device_ws_s, lwork_s, info);
1602+
cusolverDnSyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_R_64F, a_d.d_data, 2, CUDA_R_64F, w_d.d_data, CUDA_R_64F, device_ws_d, lwork_d, info);
1603+
cusolverDnSyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_32F, a_c.d_data, 2, CUDA_R_32F, w_c.d_data, CUDA_C_32F, device_ws_c, lwork_c, info);
1604+
cusolverDnSyevd(handle, params, CUSOLVER_EIG_MODE_VECTOR, CUBLAS_FILL_MODE_UPPER, 2, CUDA_C_64F, a_z.d_data, 2, CUDA_R_64F, w_z.d_data, CUDA_C_64F, device_ws_z, lwork_z, info);
1605+
1606+
a_s.D2H();
1607+
a_d.D2H();
1608+
a_c.D2H();
1609+
a_z.D2H();
1610+
w_s.D2H();
1611+
w_d.D2H();
1612+
w_c.D2H();
1613+
w_z.D2H();
1614+
1615+
cudaStreamSynchronize(0);
1616+
1617+
cusolverDnDestroyParams(params);
1618+
cusolverDnDestroy(handle);
1619+
cudaFree(device_ws_s);
1620+
cudaFree(device_ws_d);
1621+
cudaFree(device_ws_c);
1622+
cudaFree(device_ws_z);
1623+
cudaFree(info);
1624+
1625+
float expect_a[4] = {-0.894427,0.447214,0.447214,0.894427};
1626+
float expect_w[2] = {0.000000,5.000000};
1627+
if (compare_result(expect_a, a_s.h_data, 4) &&
1628+
compare_result(expect_a, a_d.h_data, 4) &&
1629+
compare_result(expect_a, a_c.h_data, 4) &&
1630+
compare_result(expect_a, a_z.h_data, 4) &&
1631+
compare_result(expect_w, w_s.h_data, 2) &&
1632+
compare_result(expect_w, w_d.h_data, 2) &&
1633+
compare_result(expect_w, w_c.h_data, 2) &&
1634+
compare_result(expect_w, w_z.h_data, 2))
1635+
printf("DnSyevd pass\n");
1636+
else {
1637+
printf("DnSyevd fail\n");
1638+
test_passed = false;
1639+
}
1640+
}
1641+
1642+
void test_cusolverDnSetAdvOptions() {
1643+
cusolverDnFunction_t a = CUSOLVERDN_GETRF;
1644+
cusolverAlgMode_t b = CUSOLVER_ALG_1;
1645+
cusolverDnParams_t p;
1646+
cusolverDnSetAdvOptions(p, a, b);
1647+
printf("DnSetAdvOptions pass\n");
1648+
}
1649+
14641650
int main() {
14651651
test_cusolverDnXgetrf();
14661652
test_cusolverDnXgetrfnp();
@@ -1477,6 +1663,9 @@ int main() {
14771663
test_cusolverDnPotrs();
14781664
test_cusolverDnSyevdx();
14791665
test_cusolverDnXsyevdx();
1666+
test_cusolverDnXsyevd();
1667+
test_cusolverDnSyevd();
1668+
test_cusolverDnSetAdvOptions();
14801669

14811670
if (test_passed)
14821671
return 0;

features/feature_case/cusolver/cusolver_test4.cu

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,6 @@ void test_cusolverDnTsyevdx_cusolverDnTheevdx() {
187187
cudaFree(device_ws_z);
188188
cudaFree(info);
189189

190-
printf("a_s:%f,%f,%f,%f\n", a_s.h_data[0], a_s.h_data[1], a_s.h_data[2], a_s.h_data[3]);
191-
printf("h_meig_s:%d\n", h_meig_s);
192-
printf("w_s:%f,%f\n", w_s.h_data[0], w_s.h_data[1]);
193-
194190
float expect_a[4] = {0.894427,-0.447214,0.447214,0.894427};
195191
int expect_h_meig = 2;
196192
float expect_w[2] = {0.000000,5.000000};
@@ -295,11 +291,6 @@ void test_cusolverDnTsygvdx_cusolverDnThegvdx() {
295291
cudaFree(device_ws_z);
296292
cudaFree(info);
297293

298-
printf("a_s:%f,%f,%f,%f\n", a_s.h_data[0], a_s.h_data[1], a_s.h_data[2], a_s.h_data[3]);
299-
printf("b_s:%f,%f,%f,%f\n", b_s.h_data[0], b_s.h_data[1], b_s.h_data[2], b_s.h_data[3]);
300-
printf("h_meig_s:%d\n", h_meig_s);
301-
printf("w_s:%f,%f\n", w_s.h_data[0], w_s.h_data[1]);
302-
303294
float expect_a[4] = {0.894427,-0.447214,0.447214,0.894427};
304295
float expect_b[4] = {1,0,0,1};
305296
int expect_h_meig = 2;
@@ -408,10 +399,6 @@ void test_cusolverDnTsygvj_cusolverDnThegvj() {
408399
cudaFree(device_ws_z);
409400
cudaFree(info);
410401

411-
printf("a_s:%f,%f,%f,%f\n", a_s.h_data[0], a_s.h_data[1], a_s.h_data[2], a_s.h_data[3]);
412-
printf("b_s:%f,%f,%f,%f\n", b_s.h_data[0], b_s.h_data[1], b_s.h_data[2], b_s.h_data[3]);
413-
printf("w_s:%f,%f\n", w_s.h_data[0], w_s.h_data[1]);
414-
415402
float expect_a[4] = {-0.894427,0.447214,0.447214,0.894427};
416403
float expect_b[4] = {1,0,0,1};
417404
float expect_w[2] = {0.000000,5.000000};

0 commit comments

Comments
 (0)