static read_scrub_code_e do_scrub_read(sg_t *sg, uint64_t offset, uint32_t num_blocks, uint32_t block_size) { unsigned char *buf = alloca(num_blocks * block_size); unsigned char cdb[16]; unsigned char sense[255]; sg_io_hdr_t hdr; #if 0 cdb_read_16(cdb, offset, num_blocks, false, true); if (!sg_submit(sg, cdb, 16, SG_DXFER_FROM_DEV, buf, num_blocks * block_size, sense, sizeof(sense), 30*1000, 0, NULL)) { fprintf(stderr, "Failed to submit READ(16): %m\n"); return READ_ERROR; } #else cdb_read_10(cdb, offset, num_blocks, false, true); if (!sg_submit(sg, cdb, 10, SG_DXFER_FROM_DEV, buf, num_blocks * block_size, sense, sizeof(sense), 30*1000, 0, NULL)) { fprintf(stderr, "Failed to submit READ(10): %m\n"); return READ_ERROR; } #endif if (!sg_read(sg, &hdr)) { fprintf(stderr, "Failed to read reply\n"); return READ_ERROR; } if (hdr.status) { fprintf(stderr, "Error while reading data: %d\n", hdr.status); return READ_ERROR; } return READ_OK; }
static bool do_inquiry(sg_t *sg, scsi_vendor_t vendor, scsi_model_t model, scsi_fw_revision_t revision, scsi_serial_t serial, int *dev_type) { unsigned char cdb[16]; unsigned char sense[255]; sg_io_hdr_t hdr; memset(inquiry_buf, 0, sizeof(inquiry_buf)); cdb_inquiry(cdb, false, 0, sizeof(inquiry_buf)); if (!sg_submit(sg, cdb, 6, SG_DXFER_FROM_DEV, inquiry_buf, sizeof(inquiry_buf), sense, sizeof(sense), 30*1000, 0, NULL)) { fprintf(stderr, "Failed to submit INQUIRY\n"); return false; } if (!sg_read(sg, &hdr)) { fprintf(stderr, "Failed to read reply\n"); return false; } if (hdr.status) { printf("Error while reading inquiry: %d\n", hdr.status); return false; } return parse_inquiry(inquiry_buf, sizeof(inquiry_buf), dev_type, vendor, model, revision, serial); }
static bool do_read_capacity(sg_t *sg, uint64_t *num_blocks, uint32_t *block_size) { unsigned char cdb[16]; unsigned char buf[256]; unsigned char sense[255]; sg_io_hdr_t hdr; cdb_read_capacity_16(cdb, sizeof(buf)); if (!sg_submit(sg, cdb, 16, SG_DXFER_FROM_DEV, buf, sizeof(buf), sense, sizeof(sense), 30*1000, 0, NULL)) { fprintf(stderr, "Failed to submit READ CAPACITY 16\n"); return false; } if (!sg_read(sg, &hdr)) { fprintf(stderr, "Failed to read reply\n"); return false; } if (hdr.status) { fprintf(stderr, "Error while reading inquiry: %d\n", hdr.status); return false; } int prot_type; bool prot_en; return parse_read_capacity_16(buf, sizeof(buf), num_blocks, block_size, &prot_type, &prot_en); }
int main() { int i, j, k; const size_t n = 100; sg_handle_t *h = sg_create_handles(n*n); double **A = malloc(n*n*sizeof(double *)); sg_init(); for (j = 0; j < n; j++) { struct potrf_data potrf_args; for (k = 0; k < j; k++) { for (i = j+1; i < n; i++) { /* A[i,j] = A[i,j] - A[i,k] * (A[j,k])^t */ struct gemm_data args; args.A = A[i*n+k]; args.B = A[j*n+k]; args.C = A[i*n+j]; sg_submit(gemm, &args, sizeof(args), "gemm", sg_read, h[i*n+k], sg_read, h[j*n+k], sg_add, h[i*n+j], 0); } } for (i = 0; i < j; i++) { /* A[j,j] = A[j,j] - A[j,i] * (A[j,i])^t */ struct syrk_data args; args.A = A[j*n+i]; args.B = A[j*n+j]; sg_submit(syrk, &args, sizeof(args), "syrk", sg_read, h[j*n+i], sg_add, h[j*n+j], 0); } /* Cholesky Factorization of A[j,j] */ potrf_args.A = A[j*n+j]; sg_submit(potrf, &potrf_args, sizeof(potrf_args), "potrf", sg_write, h[j*n+j], 0); for (i = j+1; i < n; i++) { /* A[i,j] <- A[i,j] = X * (A[j,j])^t */ struct trsm_data args; args.A = A[j*n+j]; args.B = A[i*n+j]; sg_submit(trsm, &args, sizeof(args), "trsm", sg_read, h[j*n+j], sg_write, h[i*n+j], 0); } } sg_barrier(); sg_write_log("execution.log"); sg_destroy(); free(A); sg_destroy_handles(h, n*n); return 0; }