Skip to content

Commit f840e09

Browse files
committed
Add C perf test code for CPU and FPGA
1 parent b5e68e7 commit f840e09

File tree

2 files changed

+233
-0
lines changed

2 files changed

+233
-0
lines changed

src_c/cpu_compaction_test.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include "stdio.h"
2+
#include "xtime_l.h"
3+
4+
#include "data.c"
5+
#define u32 int
6+
7+
8+
inline void copy_kv_pairs(u32 *dst, u32 *src, int src_start, int src_end, int dst_start) {
9+
for (int l = src_start; l < src_end; l++) {
10+
dst[dst_start++] = src[l];
11+
}
12+
}
13+
14+
15+
int main() {
16+
// To measure number of clock cycles
17+
XTime tStart, tEnd;
18+
19+
const int merged_results_len = merged_len;
20+
21+
// +1 due to last signal will generate a junk data
22+
u32 merged_result[merged_results_len + 1];
23+
24+
// Start testing
25+
XTime_GetTime(&tStart);
26+
27+
// Merge two SSTables (file1 and file2)
28+
int file1Ptr = 0, file2Ptr = 0;
29+
int mergedPtr = 0;
30+
int last1 = 0, last2 = 0;
31+
32+
while (last1 == 0 || last2 == 0) {
33+
// Get metadata
34+
u32 meta1 = file1[file1Ptr];
35+
u32 meta2 = file2[file2Ptr];
36+
last1 = meta1 & 0x1;
37+
last2 = meta2 & 0x1;
38+
u32 key1len = meta1 >> 8 & 0xFF;
39+
u32 key2len = meta2 >> 8 & 0xFF;
40+
u32 val1len = meta1 >> 16 & 0xFF;
41+
u32 val2len = meta2 >> 16 & 0xFF;
42+
43+
// Compare keys
44+
int common_key_length = key1len < key2len ? key1len : key2len;
45+
int winner = 0;
46+
47+
for (int k = 0; k < common_key_length; k++) {
48+
if (file1[file1Ptr + 1 + k] < file2[file2Ptr + 1 + k]) {
49+
// Copy KV pair from file1
50+
copy_kv_pairs(merged_result, file1, file1Ptr, file1Ptr + key1len + val1len + 1, mergedPtr);
51+
file1Ptr += key1len + val1len + 1;
52+
mergedPtr += key1len + val1len + 1;
53+
winner = 1;
54+
break;
55+
} else if (file1[file1Ptr + 1 + k] > file2[file2Ptr + 1 + k]) {
56+
// Copy KV pair from file2
57+
copy_kv_pairs(merged_result, file2, file2Ptr, file2Ptr + key2len + val2len + 1, mergedPtr);
58+
file2Ptr += key2len + val2len + 1;
59+
mergedPtr += key2len + val2len + 1;
60+
winner = 1;
61+
break;
62+
}
63+
}
64+
65+
if (winner == 1) {
66+
continue;
67+
}
68+
69+
// If keys are equal up to a common length, compare key lengths
70+
if (key1len < key2len) {
71+
// Copy KV pair from file1
72+
copy_kv_pairs(merged_result, file1, file1Ptr, file1Ptr + key1len + val1len + 1, mergedPtr);
73+
file1Ptr += key1len + val1len + 1;
74+
mergedPtr += key1len + val1len + 1;
75+
continue;
76+
} else if (key1len > key2len) {
77+
// Copy KV pair from file2
78+
copy_kv_pairs(merged_result, file2, file2Ptr, file2Ptr + key2len + val2len + 1, mergedPtr);
79+
mergedPtr += key2len + val2len + 1;
80+
file2Ptr += key2len + val2len + 1;
81+
continue;
82+
}
83+
84+
// If lengths are equal, select file1 cause it is considered more up to date
85+
copy_kv_pairs(merged_result, file1, file1Ptr, file1Ptr + key1len + val1len + 1, mergedPtr);
86+
file1Ptr += key1len + val1len + 1;
87+
mergedPtr += key1len + val1len + 1;
88+
file2Ptr += key2len + val2len + 1;
89+
}
90+
91+
// Copy the rest of the file1 or file2
92+
if (last1) {
93+
copy_kv_pairs(merged_result, file2, file2Ptr, file2_len, mergedPtr);
94+
} else if (last2) {
95+
copy_kv_pairs(merged_result, file1, file1Ptr, file1_len, mergedPtr);
96+
}
97+
98+
// End testing
99+
XTime_GetTime(&tEnd);
100+
101+
xil_printf("Processing took %llu clock cycles.\n", 2 * (tEnd - tStart));
102+
103+
print("Comparing values..\n");
104+
int errors_num = 0;
105+
for (int i = 0; i < merged_results_len; i++) {
106+
if (merged_result[i] != merged[i]) {
107+
xil_printf("Error at index %d, expected %0x, got %0x\n", i, merged[i], merged_result[i]);
108+
errors_num++;
109+
}
110+
}
111+
print("Comparing is done. Number of errors is %d\n", errors_num);
112+
xil_printf("Comparing is done. Number of errors is %d\n", errors_num);
113+
}
114+

src_c/fpga_compaction_test.c

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#include "xaxidma.h"
2+
#include "xparameters.h"
3+
#include "xil_cache.h"
4+
#include "stdio.h"
5+
#include "xtime_l.h"
6+
7+
#include "data.c"
8+
9+
u32 checkHalted(u32 baseAddress, u32 offset);
10+
11+
u32 init_dma(XAxiDma_Config *dmaConfig, XAxiDma *dma) {
12+
u32 status = XAxiDma_CfgInitialize(&dma, dmaConfig);
13+
if(status != XST_SUCCESS){
14+
print("DMA initialization failed\n");
15+
return -1;
16+
}
17+
print("DMA initialization success..\n");
18+
return 0;
19+
}
20+
21+
22+
int main() {
23+
// To measure number of clock cycles
24+
XTime tStart, tEnd;
25+
26+
const int merged_results_len = merged_len + 1;
27+
28+
// +1 due to last signal will generate a junk data
29+
u32 merged_result[merged_results_len + 1];
30+
u32 status;
31+
32+
XAxiDma_Config *dma1Config;
33+
XAxiDma dma1;
34+
35+
XAxiDma_Config *dma2Config;
36+
XAxiDma dma2;
37+
38+
dma1Config = XAxiDma_LookupConfigBaseAddr(XPAR_AXI_DMA_0_BASEADDR);
39+
dma2Config = XAxiDma_LookupConfigBaseAddr(XPAR_AXI_DMA_1_BASEADDR);
40+
41+
if (init_dma(dma1Config, &dma1) != 0 || init_dma(dma2Config, &dma2)) {
42+
return -1;
43+
}
44+
45+
status = checkHalted(XPAR_AXI_DMA_0_BASEADDR, 0x4);
46+
xil_printf("Status for DMA1 before data transfer %0x\n",status);
47+
48+
status = checkHalted(XPAR_AXI_DMA_1_BASEADDR, 0x4);
49+
xil_printf("Status for DMA2 before data transfer %0x\n",status);
50+
51+
// Flush cache for both memory ranges
52+
Xil_DCacheFlushRange((u32) file1, file1_len*sizeof(u32));
53+
Xil_DCacheFlushRange((u32) file2, file2_len*sizeof(u32));
54+
55+
// TODO: set register to start for the LSM-Compactron3000 hardware
56+
57+
// Start testing
58+
XTime_GetTime(&tStart);
59+
60+
// Start DMA transfer to send data to FPGA
61+
status = XAxiDma_SimpleTransfer(&dma1, (u32) file1, file1_len*sizeof(u32), XAXIDMA_DEVICE_TO_DMA);
62+
if(status != XST_SUCCESS){
63+
print("DMA1 transfer failed\n");
64+
return -1;
65+
}
66+
67+
status = XAxiDma_SimpleTransfer(&dma2, (u32) file2, file2_len*sizeof(u32), XAXIDMA_DEVICE_TO_DMA);
68+
if(status != XST_SUCCESS){
69+
print("DMA2 transfer failed\n");
70+
return -1;
71+
}
72+
73+
// Start DMA transfer to receive results back
74+
status = XAxiDma_SimpleTransfer(&dma1, (u32) merged_result, merged_results_len*sizeof(u32), XAXIDMA_DMA_TO_DEVICE);
75+
if(status != XST_SUCCESS){
76+
print("DMA1 transfer back failed\n");
77+
return -1;
78+
}
79+
80+
// wait for DMA 1, memory to device to finish
81+
status = checkHalted(XPAR_AXI_DMA_0_BASEADDR, 0x4);
82+
while(status != 1) {
83+
status = checkHalted(XPAR_AXI_DMA_0_BASEADDR, 0x4);
84+
}
85+
86+
// wait for DMA 2, memory to device to finish
87+
status = checkHalted(XPAR_AXI_DMA_1_BASEADDR, 0x4);
88+
while(status != 1) {
89+
status = checkHalted(XPAR_AXI_DMA_1_BASEADDR, 0x4);
90+
}
91+
92+
// wait for DMA 1, device to memory to finish
93+
status = checkHalted(XPAR_AXI_DMA_0_BASEADDR, 0x34);
94+
while(status != 1) {
95+
status = checkHalted(XPAR_AXI_DMA_0_BASEADDR, 0x34);
96+
}
97+
98+
// End testing
99+
XTime_GetTime(&tEnd);
100+
101+
print("DMA transfer success..\n");
102+
xil_printf("Processing took %llu clock cycles.\n", 2 * (tEnd - tStart));
103+
104+
print("Comparing values..\n");
105+
int errors_num = 0;
106+
for (int i=0; i < merged_results_len; i++) {
107+
if (merged_result[i] != merged[i]) {
108+
xil_printf("Error at index %d, expected %0x, got %0x\n", i, merged[i], merged_result[i]);
109+
errors_num++;
110+
}
111+
}
112+
xil_printf("Comparing is done. Number of errors is %d\n", errors_num);
113+
}
114+
115+
116+
u32 checkHalted(u32 baseAddress, u32 offset) {
117+
u32 status = XAxiDma_ReadReg(baseAddress, offset) & XAXIDMA_HALTED_MASK;
118+
return status;
119+
}

0 commit comments

Comments
 (0)