code: def _correlation_computation(self, task):
          
          time1 = time.time()
          s = task[0]
          nEpochs = len(self.raw_data)
          logger.debug(
              'start to compute the correlation: #epochs: %d, '
              '#processed voxels: %d, #total voxels to compute against: %d' %
              (nEpochs, task[1], self.num_voxels2)
          )
          corr = np.zeros((task[1], nEpochs, self.num_voxels2),
                          np.float32, order='C')
          count = 0
          for i in range(len(self.raw_data)):
              mat = self.raw_data[i]
              mat2 = self.raw_data2[i] if self.raw_data2 is not None else mat
              no_trans = 'N'
              trans = 'T'
              blas.compute_self_corr_for_voxel_sel(no_trans, trans,
                                                   self.num_voxels2, task[1],
                                                   mat.shape[0], 1.0,
                                                   mat2, self.num_voxels2,
                                                   s, mat, self.num_voxels,
                                                   0.0, corr,
                                                   self.num_voxels2 * nEpochs,
                                                   count)
              count += 1
          time2 = time.time()
          logger.debug(
              'correlation computation for %d voxels, takes %.2f s' %
              (task[1], (time2 - time1))
          )
          return corr
docs: Use BLAS API to do correlation computation (matrix multiplication).
  
          Parameters
          ----------
          task: tuple (start_voxel_id, num_processed_voxels)
              depicting the voxels assigned to compute
  
          Returns
          -------
          corr: 3D array in shape [num_processed_voxels, num_epochs, num_voxels]
              the correlation values of all subjects in all epochs
              for the assigned values, in row-major
              corr[i, e, s + j] = corr[j, e, s + i]