// Convert CSR to ELL for better performanceCSRMatrix*csr=csr_create(1000,1000,5000);// ... fill CSR data ...ELLMatrix*ell=ell_create(1000,1000,50);ell_from_csr(ell,csr);ell_to_gpu(ell);// ELL is often fasterSpMVResultresult=spmv_ell(ell,d_x.data(),d_y.data(),1000);ell_destroy(ell);csr_destroy(csr);
#include<spmv/pagerank.h>voidcompute_pagerank(constCSRMatrix*adjacency,intn){// Initialize rank vectorCudaBuffer<float>d_rank(n);std::vector<float>initial(n,1.0f/n);cudaMemcpy(d_rank.data(),initial.data(),n*sizeof(float),cudaMemcpyHostToDevice);// Configure and runPageRankConfigconfig;config.damping=0.85f;config.tolerance=1e-6f;config.max_iterations=100;SpMVResultresult=pagerank(adjacency,d_rank.data(),&config);if(result.error==SpMVError::SUCCESS){printf("PageRank converged in %.2f ms\n",result.time_ms);}}
6. Context Reuse
1
2
3
4
5
6
7
8
9
10
// Reuse execution context for better performancevoidbatch_spmv(CSRMatrix*csr,constfloat*d_x,float*d_y,intn,intiterations){SpMVConfigconfig=spmv_auto_config(csr);// Context created outside loopfor(inti=0;i<iterations;i++){SpMVResultresult=spmv_csr(csr,d_x,d_y,&config,n);// Internal resources are reused}}