
头文件的定义//filter.h#ifndef__FILTER_HEADER__#define__FILTER_HEADER__#includesstream#includestring#includevectornamespaceruda{constintRUDA_ERR-1;constintRUDA_OK0;enumCompOperator{EQ0,LESS,GREATER,LESS_EQ,GREATER_EQ,};inlinestd::stringtoStringCompOperator(CompOperator op){switch(op){caseEQ:returnEQ;caseLESS:returnLESS;caseGREATER:returnGREATER;caseLESS_EQ:returnLESS_EQ;caseGREATER_EQ:returnGREATER_EQ;default:returnINVALID;}}structIntComparator{CompOperator _op;int_pivot;std::stringtoString()const{std::stringstream ss;ss_op: toStringCompOperator(this-_op), _pivot: _pivot;returnss.str();}};intsstIntFilter(conststd::vectorintvalues,constIntComparator rawComp,std::vectorboolresults);}#endif//filter.cu#includefilter.h#includestdio.h#includeiostream#includevector#includestring#includethrust/device_vector.h#includethrust/host_vector.h#includethrust/transform.h#includethrust/functional.h#includealgorithmnamespaceruda{structCudaIntComparator{IntComparator _rawComp;CudaIntComparator(IntComparator rawComp){this-_rawComprawComp;}__host__ __device__booloperator()(constinttarget){switch(this-_rawComp._op){caseEQ:returntargetthis-_rawComp._pivot;caseLESS:returntargetthis-_rawComp._pivot;caseGREATER:returntargetthis-_rawComp._pivot;caseLESS_EQ:returntargetthis-_rawComp._pivot;caseGREATER_EQ:returntargetthis-_rawComp._pivot;default:returnfalse;}}std::stringtoString(){returnthis-_rawComp.toString();}};intsstIntFilter(conststd::vectorintvalues,constIntComparator rawComp,std::vectorboolresults){std::cout[RUDA][sstIntFilter] Startstd::endl;results.resize(values.size());std::cout[sstIntFilter] Inputsstd::endl;std::cout[sstIntFilter] Inputs - valuesstd::endl;for(inti0;ivalues.size();i){std::coutvalues[i] ;}std::coutstd::endl;std::cout[sstIntFilter] Inputs - rawComp: rawComp.toString()std::endl;thrust::device_vectorintd_values(values);thrust::device_vectorintd_results(values.size());CudaIntComparatorcudaComp(rawComp);std::cout[sstIntFilter] Devicesstd::endl;std::cout[sstIntFilter] Devices - d_valuesstd::endl;//非并行的搬移数据到devicefor(inti0;id_values.size();i){std::coutd_values[i] ;}std::coutstd::endl;std::cout[sstIntFilter] cudaComp: cudaComp.toString()std::endl;thrust::copy_if(d_values.begin(),d_values.end(),d_results.begin(),cudaComp);//条件复制按照cudaComp复制符合条件的value到resultcudaDeviceSynchronize();std::cout[sstIntFilter] Resultsstd::endl;std::cout[sstIntFilter] Results - d_resultsstd::endl;for(inti0;id_results.size();i){std::coutd_results[i] ;}std::coutstd::endl;thrust::copy(d_results.begin(),d_results.end(),results.begin());std::cout[sstIntFilter] Results - resultsstd::endl;for(inti0;iresults.size();i){std::coutresults[i] ;}std::coutstd::endl;returnruda::RUDA_OK;}}//实现GPU上简单的int比较操作符#includeiostream#includevector#includefilter.hintmain(){std::cout[FILTER_TEST] Startsstd::endl;ruda::IntComparator comp{ruda::GREATER_EQ,5,};std::vectorintvalues{1,2,3,4,5,6,7,8,9};std::vectorboolresults;std::cout[FILTER_TEST] Run SST Filterstd::endl;ruda::sstIntFilter(values,comp,results);std::cout[FILTER_TEST] Resultsstd::endl;for(inti0;iresults.size();i){std::coutresults[i] ;}std::coutstd::endl;return0;}CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(FilterProject) set(CMAKE_BUILD_TYPE Debug) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) find_package(CUDA REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) cuda_add_library(filter STATIC filter.cu) add_executable(runnable_filter_test filter_test.cc) target_link_libraries(runnable_filter_test filter ${CUDA_LIBRARIES})输出