问题是由于输入矩阵中sparse类型的数值存储结构不连续,导致CPU和GPU之间的内存传输会越界而引发访问违例问题。解决方法是将输入矩阵转换为COO格式,先在CPU端执行矩阵乘法,再将结果复制到GPU上。代码示例如下:
array multiply_sparse(const array& A, const array& B)
{
// Change input format to COO
array A_coo = af::sparseConvertTo(A, AF_STORAGE_CSR);
array B_coo = af::sparseConvertTo(B, AF_STORAGE_CSR);
// CPU matrix multiplication
array C = af::sparseMatMul(A_coo, B_coo, AF_MAT_NONE, AF_MAT_NONE);
// Copy result to GPU
return af::copyArray(C);
}