Performance
[
Front page
] [
New
|
Page list
|
Search
|
Recent changes
|
Help
|
Log in
]
Start:
[[zFIFO - an AXI DMA driver for Zynq and ZynqMP]]
* 性能チューニング [#x6b0a09e]
** クロック周波数の調整 [#zc4c0b77]
ZynqMP では、PS から供給される PL のクロックが fclk ドラ...
$ echo 200000000 | sudo tee /sys/devices/platform/fclk0/...
$ cat /sys/devices/platform/fclk0/set_rate
187499999
のような感じです。この例では 200MHz にセットして、実際に...
** AXI Stream バンド幅の変更 [#r55b593d]
PS の Slave AXI インタフェイスは ZynqMP では 128bit, Zynq...
* 性能測定 [#qdbfc8a1]
#ref(bw.png);
この図は以下のようなコードを用いて、Ultra96 (無印) で測定...
- 100MHz 32bit: 680MB/s
- 100MHz 64bit: 970MB/s
- 150MHz 32bit: 1050MB/s
- 150MHz 64bit: 1110MB/s
- 250MHz 64bit: 1350MB/s
となります。クロック周波数を上げてもあまり性能が伸びない...
#geshi(c,number){{
// Bandwidth tester
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <omp.h>
#include "zfifo.h"
#include "mysecond.c"
int main(){
int fd = open("/dev/zfifo0", O_RDWR | O_SYNC);
if (fd<0) {
printf("Can't open /dev/zfifo0!\n");
return -1;
}
unsigned maxsize = 8*1024*1024;
unsigned *send = (unsigned*)malloc(maxsize * sizeof(uns...
unsigned *recv = (unsigned*)malloc(maxsize * sizeof(uns...
for (unsigned i=0; i<maxsize; i++){
send[i] = i;
recv[i] = 0;
}
for (int size=4; size<=maxsize; size*=2){
int ntimes = maxsize / size;
if (ntimes< 100) ntimes = 100;
if (ntimes> 1000) ntimes = 1000;
printf("size %d ntimes %d ", (int)size*sizeof(unsigne...
double start = mysecond();
for (int n=0; n<ntimes; n++){
// Send & recv in parallel because FIFO deadlocks
#pragma omp parallel for
for(int i=0; i<2; i++){
if (i==0){
// printf("Send on thread %d\n", omp_get_thread...
zf_send(fd, (char*)send, sizeof(unsigned)*size);
}
if (i==1){
// printf("Recv on thread %d\n", omp_get_thread...
zf_recv(fd, (char*)recv, sizeof(unsigned)*size);
}
}
}
double stop = mysecond();
double elapsed = stop-start;
size_t total_size = ntimes * size * 2 * sizeof(unsign...
double throughput = (double)total_size/(1000*1000*ela...
printf("%lf sec %lf MB/s\n", elapsed, throughput);
}
close(fd);
return 0;
}
}}
End:
[[zFIFO - an AXI DMA driver for Zynq and ZynqMP]]
* 性能チューニング [#x6b0a09e]
** クロック周波数の調整 [#zc4c0b77]
ZynqMP では、PS から供給される PL のクロックが fclk ドラ...
$ echo 200000000 | sudo tee /sys/devices/platform/fclk0/...
$ cat /sys/devices/platform/fclk0/set_rate
187499999
のような感じです。この例では 200MHz にセットして、実際に...
** AXI Stream バンド幅の変更 [#r55b593d]
PS の Slave AXI インタフェイスは ZynqMP では 128bit, Zynq...
* 性能測定 [#qdbfc8a1]
#ref(bw.png);
この図は以下のようなコードを用いて、Ultra96 (無印) で測定...
- 100MHz 32bit: 680MB/s
- 100MHz 64bit: 970MB/s
- 150MHz 32bit: 1050MB/s
- 150MHz 64bit: 1110MB/s
- 250MHz 64bit: 1350MB/s
となります。クロック周波数を上げてもあまり性能が伸びない...
#geshi(c,number){{
// Bandwidth tester
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <omp.h>
#include "zfifo.h"
#include "mysecond.c"
int main(){
int fd = open("/dev/zfifo0", O_RDWR | O_SYNC);
if (fd<0) {
printf("Can't open /dev/zfifo0!\n");
return -1;
}
unsigned maxsize = 8*1024*1024;
unsigned *send = (unsigned*)malloc(maxsize * sizeof(uns...
unsigned *recv = (unsigned*)malloc(maxsize * sizeof(uns...
for (unsigned i=0; i<maxsize; i++){
send[i] = i;
recv[i] = 0;
}
for (int size=4; size<=maxsize; size*=2){
int ntimes = maxsize / size;
if (ntimes< 100) ntimes = 100;
if (ntimes> 1000) ntimes = 1000;
printf("size %d ntimes %d ", (int)size*sizeof(unsigne...
double start = mysecond();
for (int n=0; n<ntimes; n++){
// Send & recv in parallel because FIFO deadlocks
#pragma omp parallel for
for(int i=0; i<2; i++){
if (i==0){
// printf("Send on thread %d\n", omp_get_thread...
zf_send(fd, (char*)send, sizeof(unsigned)*size);
}
if (i==1){
// printf("Recv on thread %d\n", omp_get_thread...
zf_recv(fd, (char*)recv, sizeof(unsigned)*size);
}
}
}
double stop = mysecond();
double elapsed = stop-start;
size_t total_size = ntimes * size * 2 * sizeof(unsign...
double throughput = (double)total_size/(1000*1000*ela...
printf("%lf sec %lf MB/s\n", elapsed, throughput);
}
close(fd);
return 0;
}
}}
Page: