diff --git a/bandwidth/main.c b/bandwidth/main.c index 49c5b6d..e7d9359 100644 --- a/bandwidth/main.c +++ b/bandwidth/main.c @@ -150,12 +150,18 @@ int init_value(void) void usage(char* prog){ - printf("%s: -n -v \n", prog); + printf("%s: -n -v -r -d -f\n", prog); + printf("num0: spu number\n"); + printf("num1: repeat number\n"); + printf("num2: direction (1: get, 2: put, 3 get put\n"); + printf("-f: fixed area get put\n"); return; } int need_verify = 0; int g_spe_threads ; int repeat_num=2; +int dir = (FLAG_GET | FLAG_PUT); +int fixed = 0; int processopt(int argc, char **argv) { @@ -166,7 +172,7 @@ processopt(int argc, char **argv) n = 1;/*default number of spus*/ - while ((c = getopt (argc, argv, "n:vr:")) != -1){ + while ((c = getopt (argc, argv, "n:vr:d:f")) != -1){ switch (c) { case 'n': @@ -183,10 +189,20 @@ processopt(int argc, char **argv) return -1; } break; + case 'd': + cvalue = optarg; + if (sscanf(cvalue, "%d", &dir) ==0 || n < 0){ + fprintf(stderr, "Invalid direction(%d)\n", n); + return -1; + } + break; case 'v': need_verify = 1; break; + case 'f': + fixed = FLAG_FIXED; + break; case '?': if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); @@ -247,10 +263,18 @@ int main(int argc, char **argv) si[i].rank = i; si[i].speid = (unsigned long)spe_ids[i]; - si[i].count = totalcount/g_spe_threads; - si[i].bufa = (unsigned long)bufa; - si[i].bufc = (unsigned long)bufc; - + si[i].count = (((1024 / 2) / g_spe_threads) + (i < ((1024 / 2) % g_spe_threads))) * 1024 * 16 * 2; + if (!i) { + si[i].bufa = (unsigned long)bufa; + si[i].bufc = (unsigned long)bufc; + } else { + si[i].bufa = si[i-1].bufa + si[i-1].count; + si[i].bufc = si[i-1].bufc + si[i-1].count; + } + si[i].flags = dir | fixed; + printf("SPU%d: rank=%d speid=%ld count=%d(%#x) bufa=%#lx bufc=%#lx flags=%#x\n", + i, si[i].rank, si[i].speid, si[i].count, si[i].count, si[i].bufa, si[i].bufc, si[i].flags); + } @@ -302,7 +326,11 @@ int main(int argc, char **argv) ave_time = totaltime /num_runs; printf("average time is =%f\n", ave_time); - bandwidth = (COUNT*2)/ave_time/1000000000; + if (dir == (FLAG_GET | FLAG_PUT)) { + bandwidth = (COUNT*2)/ave_time/1000000000; + } else { + bandwidth = (COUNT)/ave_time/1000000000; + } printf("bandwidth is %f GB/s\n", bandwidth); return (0); } diff --git a/bandwidth/spu/simple_spu.c b/bandwidth/spu/simple_spu.c index e857b36..ec4251b 100644 --- a/bandwidth/spu/simple_spu.c +++ b/bandwidth/spu/simple_spu.c @@ -63,16 +63,23 @@ do_compute_db() int current, next; int k; int i0; + int get, put, range; count = myinfo->count; a = (char*)&ls_bufa[0]; c = (char*)&ls_bufc[0]; - i0 = myinfo->rank*count; + i0 = 0; next = current = 0 ; - - for (k=0;k < NUM_DMA; k++){ - spu_mfcdma32(a + k*DMA_COUNT, (unsigned long)myinfo->bufa + i0 + k*DMA_COUNT, DMA_COUNT, tag_id , MFC_GET_CMD); + + get = myinfo->flags & FLAG_GET; + put = myinfo->flags & FLAG_PUT; + range = myinfo->flags & FLAG_FIXED; + + if (get) { + for (k=0;k < NUM_DMA; k++){ + spu_mfcdma32(a + k*DMA_COUNT, (unsigned long)myinfo->bufa + i0 + k*DMA_COUNT, DMA_COUNT, tag_id , MFC_GET_CMD); + } } for( i = i0; i < i0 + count; i+= NUM_DMA*DMA_COUNT){ @@ -80,15 +87,20 @@ do_compute_db() next = NUM_DMA*DMA_COUNT - current; if (i + NUM_DMA*DMA_COUNT < i0+ count){ - for (k =0;k < NUM_DMA; k++){ - spu_mfcdma32(a + next+k*DMA_COUNT, (unsigned long)myinfo->bufa + (i+ (NUM_DMA+k)*DMA_COUNT), DMA_COUNT, tag_id , MFC_GET_CMD); + if (get) { + for (k =0;k < NUM_DMA; k++){ + int offset = (range) ? next : i; + spu_mfcdma32(a + next+k*DMA_COUNT, (unsigned long)myinfo->bufa + (offset+ (NUM_DMA+k)*DMA_COUNT), DMA_COUNT, tag_id , MFC_GET_CMD); + } } - } - for (k=0;k< NUM_DMA; k++){ - spu_mfcdma32(a+current+k*DMA_COUNT, (unsigned long)myinfo->bufc + i + k*DMA_COUNT, DMA_COUNT, tag_id , MFC_PUT_CMD); + if (put) { + for (k=0;k< NUM_DMA; k++){ + int offset = (range) ? current : i; + spu_mfcdma32(a+current+k*DMA_COUNT, (unsigned long)myinfo->bufc + offset + k*DMA_COUNT, DMA_COUNT, tag_id , MFC_PUT_CMD); + } } current = next; } diff --git a/bandwidth/spu/speinfo.h b/bandwidth/spu/speinfo.h index 0a0033d..e6e0166 100644 --- a/bandwidth/spu/speinfo.h +++ b/bandwidth/spu/speinfo.h @@ -3,6 +3,10 @@ #define MAXSPE 8 +#define FLAG_GET 0x00000001 +#define FLAG_PUT 0x00000002 +#define FLAG_FIXED 0x00000004 + struct spe_info{ int rank; unsigned long speid; @@ -13,7 +17,8 @@ struct spe_info{ void* ls; void* sig1; void* control_area; - char pad[12]; + unsigned int flags; + char pad[8]; };