/* Tom Gall (tom.gall@linaro.org / tom_gall@mac.com) * Copyright 2014 Linaro * Distributed under the terms and conditions of the license documented in LICENSE */ #include #include #include #include "sqlite3.h" #include #include #include #include "opencl-sqlite.h" #include int main(int argc, char **argv){ opencl_sqlite_context *s; sqlite3 *db; char *errMsgBuffer = NULL; FILE *resultFile; int rc; char *databaseName="db/hundredthousand.db"; char *sql = "SELECT * FROM test "; char *sql1 = "SELECT id, uniformi, normali5 FROM test WHERE uniformi > 60 AND normali5 < 0"; char* sql2 = "SELECT id, uniformf, normalf5 FROM test WHERE uniformf > 60 AND normalf5 < 0"; char *sql3 ="SELECT id, uniformi, normali5 FROM test WHERE uniformi > -60 AND normali5 < 5"; char *sql4 ="SELECT id, uniformf, normalf5 FROM test WHERE uniformf > -60 AND normalf5 < 5"; char *sql5 ="SELECT id, normali5, normali20 FROM test WHERE (normali20 + 40) > (uniformi - 10)"; char *sql6 ="SELECT id, normalf5, normalf20 FROM test WHERE (normalf20 + 40) > (uniformf - 10)"; char *sql7 ="SELECT id, normali5, normali20 FROM test WHERE normali5 * normali20 BETWEEN -5 AND 5"; char *sql8 ="SELECT id, normalf5, normalf20 FROM test WHERE normalf5 * normalf20 BETWEEN -5 AND 5"; char *sql9 ="SELECT id, uniformi, normali5, normali20 FROM test WHERE NOT uniformi OR NOT normali5 OR NOT normali20"; char *sql10 ="SELECT id, uniformf, normalf5, normalf20 FROM test WHERE NOT uniformf OR NOT normalf5 OR NOT normalf20"; char *sql11 ="SELECT SUM(normalf20) FROM test"; char *sql12 ="SELECT AVG(uniformi) FROM test WHERE uniformi > 0"; char *sql13 ="SELECT MAX(normali5), MIN(normali5) FROM test"; sqlite3_stmt *selectAll_statement=NULL, *countAll_statement = NULL; opencl_data_shard col1_shard, col2_shard; unsigned long long scratch; int rowcount, *result_counts; struct timespec startCountTime, endCountTime, startSelectTime, endSelectTime; cl_int i,j,z, err; int iv, iv2, iv3; float fv, fv2; int columnSettings[7]; s = malloc(sizeof (opencl_sqlite_context)); /* Data and buffers */ size_t work_units_per_kernel; rc = sqlite3_open(databaseName, &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return(1); } opencl_collect_timestamp(&startCountTime); rc = sqlite3_prepare_v2(db, "SELECT COUNT(*) FROM test", -1, &countAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } sqlite3_step(countAll_statement); rowcount=sqlite3_column_int(countAll_statement,0); opencl_collect_timestamp(&endCountTime); sqlite3_reset(countAll_statement); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); sqlite3_column_int(selectAll_statement,2); sqlite3_column_int(selectAll_statement,3); sqlite3_column_double(selectAll_statement,4); sqlite3_column_double(selectAll_statement,5); sqlite3_column_double(selectAll_statement,6); } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("Select"); printf("rowcount = %d\n",rowcount); /* benchmark the 13 queries */ opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql1, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { iv=sqlite3_column_int(selectAll_statement,0); iv2=sqlite3_column_int(selectAll_statement,1); iv3=sqlite3_column_int(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql1 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount %d\n",rowcount,i); // resultFile=fopen("./sq-results-sql2.txt","w"); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql2, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { iv=sqlite3_column_int(selectAll_statement,0); fv=sqlite3_column_double(selectAll_statement,1); fv2=sqlite3_column_double(selectAll_statement,2); i++; // fprintf(resultFile,"%d %f %f\n", iv, fv, fv2); } opencl_collect_timestamp(&endSelectTime); // fclose(resultFile); sqlite3_reset(selectAll_statement); printf("sql2 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount %d \n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql3, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); sqlite3_column_int(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql3 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount, i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql4, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_double(selectAll_statement,1); sqlite3_column_double(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql4 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql5, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i = 0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); sqlite3_column_int(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql5 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql6, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_double(selectAll_statement,1); sqlite3_column_double(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql6 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql7, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); sqlite3_column_int(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql7 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql8, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_double(selectAll_statement,0); sqlite3_column_double(selectAll_statement,1); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql8 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql9, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i = 0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); sqlite3_column_int(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql9 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount, i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql10, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } i=0; while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_double(selectAll_statement,0); sqlite3_column_double(selectAll_statement,1); sqlite3_column_double(selectAll_statement,2); i++; } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql10 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\nresultcount = %d\n",rowcount,i); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql11, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_double(selectAll_statement,0); } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql11 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\n",rowcount); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql12, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql12 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\n",rowcount); opencl_collect_timestamp(&startSelectTime); rc= sqlite3_prepare_v2(db, sql13, -1, &selectAll_statement, NULL); if ( rc!=SQLITE_OK) { fprintf(stderr, "SQL error:%s\n", sqlite3_errmsg(db)); } while (sqlite3_step(selectAll_statement) == SQLITE_ROW) { sqlite3_column_int(selectAll_statement,0); sqlite3_column_int(selectAll_statement,1); } opencl_collect_timestamp(&endSelectTime); sqlite3_reset(selectAll_statement); printf("sql13 "); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("rowcount = %d\n",rowcount); columnSettings[0]=0; columnSettings[1]=0; columnSettings[2]=0; columnSettings[3]=0; columnSettings[4]=0; columnSettings[5]=0; columnSettings[6]=0; opencl_init(s, db, 3*1024*1024,3*1024*1024,argv[1]); for (i=2; i<9; i++) { if (*argv[i]=='1') columnSettings[i-2]=1; } if (*argv[9]=='f') { j=128; } else { j = 64; } opencl_prepare_data(s, sql, columnSettings); if (argc == 11) { if (*argv[10]=='d') { opencl_map_output_vector_data(s); opencl_shard_data(s, &col1_shard, 1); opencl_shard_data(s, &col2_shard, 2); } else { opencl_map_input_data(s); } } else if (argc == 10) { opencl_map_input_data(s); } /* resultFile = fopen("./ocl-results-sql2.txt", "w"); char *resultData = (char *)s->results_cpu->r; for(j=0; i; i--) { fprintf(resultFile,"%d %d %d\n", *((int *) (resultData+j)), *((int *) (resultData+j+4)), *((int *) (resultData+j+8))); j+=12; } fclose(resultFile); */ if (argc == 10) opencl_map_output_data(s,j); // 11 if (argc == 11) { if (*argv[10]=='a') opencl_map_output_summary_data(s,j, 1); // 12 else if (*argv[10]=='b') opencl_map_output_xsummary_data(s,j, 1); //13 else if (*argv[10]=='c') opencl_map_output_summary_data(s,j, 2); } if ((argc == 11) && (*argv[10]=='d')) { opencl_collect_timestamp(&startSelectTime); opencl_vector_select(s, &col1_shard, &col2_shard, j); } else { opencl_collect_timestamp(&startSelectTime); opencl_rowcolumn_select(s, j); } if (argc == 10) i=opencl_transfer_results(s, j, 3); // 11 if (argc == 11) { if (*argv[10]=='a') opencl_transfer_fsummary_results(s, j); // 12 else if (*argv[10]=='b') i=opencl_transfer_ixsummary_results(s, j , 1); // 13 else if (*argv[10]=='c') i=opencl_transfer_isummary_results(s, j , 2); else if (*argv[10]=='d') i = opencl_transfer_vector_results(s); opencl_result_vector_to_result_buffer(s); } opencl_collect_timestamp(&endSelectTime); opencl_release(s); printf("OpenCL %s ",argv[1]); opencl_print_time_interval(&startSelectTime, &endSelectTime); printf("resultcount = %d\n",i); opencl_cleanup(s); sqlite3_close(db); return 0; }