Tag: 性能

改进快速排序

如果可能,我如何改进以下快速排序(性能明智)。 有什么建议? void main() { quick(a,0,n-1); } void quick(int a[],int lower,int upper) { int loc; if(lower<upper) { loc=partition(a,lower,upper); quick(a,lower,loc-1); quick(a,loc+1,upper); } } /* Return type: int Parameters passed: Unsorted array and its lower and upper bounds */ int partition(int a[],int lower,int upper) { int pivot,i,j,temp; pivot=a[lower]; i=lower+1; j=upper; while(i<j) { while((i<upper)&&(a[i]pivot)) j–; if(ia[j]) { temp=a[j]; […]

基准测试代码 – 我做得对吗?

我想对C / C ++代码进行基准测试。 我想测量cpu时间,挂起时间和周期/字节。 我写了一些测量函数但是有周期/字节的问题。 为了得到一个cpu时间,我用RUSAGE_SELF编写了一个函数getrusage() ,对于墙上时间我使用带有RUSAGE_SELF clock_gettime ,得到周期/字节我使用rdtsc 。 我处理一个大小的输入缓冲区,例如1024: char buffer[1024] 。 我如何基准测试: 做一个热身阶段,只需调用fun2measure(args) 1000次: for(int i=0; i<1000; i++) fun2measure(args); 然后,做一个实时基准测试,为墙上时间: `unsigned long i; 双倍时间; double timeTotal = 3.0; //处理3秒 for(timeTaken =(double)0,i = 0; timeTaken <= timeTotal; timeTaken = walltime(1),i ++)fun2measure(args); ` 而对于cpu时间(几乎相同): for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), […]

memcpy和memmove的意外性能

为什么memcpy在我的系统上执行速度比memmove慢? 从阅读其他SO问题,例如这个或这个给人的印象是memcpy应该比memmove更快,直观地说,这应该是这样。 毕竟,memcpy的检查次数较少,手册页也与他们所说的相符。 但是,在测量每个函数内部所花费的时间时,memmove会记住memcpy! 更重要的是,它似乎也超过了memset,当memset似乎可以从memcpy或memmove无法实现的优化中受益。 为什么会这样? 我的电脑上的结果(众多之一): [INFO] (ex23.c:151 func: main) Normal copy: 109092 [INFO] (ex23.c:198 func: main) memcpy: 66070 [INFO] (ex23.c:209 func: main) memmove: 53149 [INFO] (ex23.c:219 func: main) memset: 52451 用于提供此结果的代码: #include #include #include “dbg.h” // debugging macros #include int main(int argc, char *argv[]) { char from[10000] = {‘a’}; char to[10000] = {‘c’}; […]

在C中提高文件IO的性能

在对它们执行堆操作之后,我需要逐个将大量的整数写入文件。 我试图将排序的文件合并到一个文件中。 截至目前,我正在每次操作后写入文件。 我使用min heap来合并文件。 我的问题是 – 执行文件写入时,每次写入文件或一次写入多块内存块时是否访问磁盘? 如果我将在大小为1024的数组中输出堆,或者可能更多,然后立即执行写操作,它会改善性能吗? 先感谢您。 编辑 – 将使用setbuffer()帮助? 我认为它应该在某种程度上有所帮助。

OpenCL缓冲区分配和映射最佳实践

关于使用OpenCL映射缓冲区的代码是否正确,我有点困惑。 我有两个例子,一个使用CL_MEM_USE_HOST_PTR,一个使用CL_MEM_ALLOC_HOST_PTR。 在本地计算机和OpenCL设备上都可以工作和运行,但我感兴趣的是这是否是正确的映射方式,以及它是否应该适用于所有OpenCL设备。 我对USE_HOST_PTR示例特别不确定。 我只对缓冲区/地图特定操作感兴趣。 我知道我应该做错误检查等等。 CL_MEM_ALLOC_HOST_PTR: // pointer to hold the result int * host_ptr = malloc(size * sizeof(int)); d_mem = clCreateBuffer(context,CL_MEM_READ_WRITE|CL_MEM_ALLOC_HOST_PTR, size*sizeof(cl_int), NULL, &ret); int * map_ptr = clEnqueueMapBuffer(command_queue,d_mem,CL_TRUE,CL_MAP_WRITE, 0,size*sizeof(int),0,NULL,NULL,&ret); // initialize data for (i=0; i<size;i++) { map_ptr[i] = i; } ret = clEnqueueUnmapMemObject(command_queue,d_mem,map_ptr,0,NULL,NULL); //Set OpenCL Kernel Parameters ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), […]

高效的访问矩arrays

高效的访问问题:我需要按列访问大型矩阵(超过2000×2000),我的算法需要1行传递和1列传递。 行传递对于内存效率(缓存未命中)是好的,但是如何减少列传递中的缓存未命中? 我需要效率。 我唯一拥有的是:声明n局部变量(基于内存获取大小), int a1, a2, a3, a4; for ( int j = 0 ; j < DIM_Y ; j+=4 ) for ( int i = 0 ; i < DIM_X ; i++ ) a1 = matrix[i][j]; … ; a4 = matrix[i][j+4]; // make the column processing on the 4 variables. 它是C或C ++,以及数组或int或char。 任何提议和评论都受到欢迎。 […]

优化性能 – 在图形上实现自定义算法

对于我的大学任务,我需要提出一种算法,找到具有相同权重的最大边数的生成树。 可以在此处找到任务的描述: 查找具有相同权重的最大边数的生成树 。 在那里你还可以看到我用C语言实现的upvoted解决方案(由@mrip建议)。 我已在本地计算机上测试了代码,并在不同的数据集上提供了正确的输出。 但是,当我将解决方案上传到高程系统时,我发现程序完成时间比参考时间长3倍。 这是项目中的两个文件。 我当然添加了详细的评论: header.h //struct for subsets used in MST Kruskal algoritm typedef struct subset { int parent; int rank; } subset_t, *subset_p; //struct for storing graph edges typedef struct edges { int src; int dest; int weight; } edges_t, *edges_p; //struct for storing weights and number of their […]

如何正确测量CUDA时间?

我试图正确测量并行和顺序执行的时间,但我怀疑是因为: 假设我们有以下代码: //get the time clock_t start,finish; double totaltime; start = clock(); double *d_A, *d_B, *d_X; cudaMalloc((void**)&d_A, sizeof(double) * Width * Width); cudaMalloc((void**)&d_B, sizeof(double) * Width); cudaMalloc((void**)&d_X, sizeof(double) * Width); cudaMemcpy(d_A, A, sizeof(double) * Width * Width, cudaMemcpyHostToDevice); cudaMemcpy(d_B, B, sizeof(double) * Width, cudaMemcpyHostToDevice); do_parallel_matmul<<>>(d_A, d_B, d_X, Width); cudaMemcpy(X, d_X, sizeof(double) * Width, cudaMemcpyDeviceToHost); finish […]

签名比无符号整数更快

可能重复: 无符号vs有符号整数的性能 我已经读过某个地方,在x86_64用比较无signed ints的C/C++中的有unsigned ints来比较快,例如for (int i… )比for (uint i…) “更快”。 真的吗? 为什么这是真的? 我知道差异很小,但无论如何。

openmp慢了多个线程,想不通

我遇到一个问题,我的以下代码使用openmp运行速度较慢: chunk = nx/nthreads; int i, j; for(int t = 0; t < n; t++){ #pragma omp parallel for default(shared) private(i, j) schedule(static,chunk) for(i = 1; i < nx/2+1; i++){ for(j = 1; j < nx-1; j++){ T_c[i][j] =0.25*(T_p[i-1][j] +T_p[i+1][j]+T_p[i][j-1]+T_p[i][j+1]); T_c[nx-i+1][j] = T_c[i][j]; } } copyT(T_p, T_c, nx); } print2file(T_c, nx, file); 问题是当我运行多个线程时,计算时间会更长。