如何利用多核电脑实现Matlab的并行运算

如何利用多核电脑实现Matlab的并行运算,第1张

1、首先在多核电脑上打开Matlab进入命令编辑窗口,点击快捷工具栏中的“新建脚本”,如下图所示。

2、Matlab中利用imopen函数可以对图像做开运算,而函数还需要指定一个元素结构作为第二个参数,再加上要读取图片和显示前后对比的图片。

3、点击“保存并运行”按钮,如下图所示。

4、选择m文件的保存位置,设置文件名,如下图所示。

5、这样,就在Matlab中对图像做了开运算,并会d出对话框来显示原始图片和开运算图像的对比结果,如下图所示。

openmp并行程序在多核linux上最大化使用cpu的方法如下:

#include <stdio.h>

#include <stdlib.h>

#include <omp.h>

#include <time.h>

int main()

{

    long long i

    long double sum = .0

    long double sec = .0

    // Multi-thread compute start

    clock_t t1 = clock()

    #pragma omp parallel for

    for (i = 0 i < 1000000000 i++)

    {

        sum += i/100

    }

    clock_t t2 = clock()

    sec = (t2 - t1)

    //sec = (t2 - t1)

    printf("Program costs %.2Lf clock tick.\n", sec)

    exit(EXIT_SUCCESS)

}

以上代码中,#pragma omp parallel for

这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0i <1000000000i++)这个循环执行过程平均分配给每一个CPU核心。

去掉#pragma omp parallel for这行,则和普通的串行代码效果一致。

注意,要使用openmp功能,在编译的时候需要加上-fopenmp编译参数。

以下是两种编译搭配两种代码出现的4种结果,可以很直观地看到效果:

1、代码里含有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 50202611.00 clock tick.

2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4068178.00 clock tick.

3、代码里没有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4090744.00 clock tick.

4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4170093.00 clock tick.

可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。

值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。

CPU在某一个时间点上确实只能执行一个线程,但是多线程不是由于多核或者双核才叫多线程。

是由于,很多个线程在并行执行的时候,CPU根据一定的线程调度算法,频繁的进行线程切换,当正在执行的一个线程需要进行IO *** 作或者需要访问内存的时候,CPU完全可以放弃该线程,转而调度线程就绪队列上的其他线程,被放弃的线程则进入阻塞状态,IO *** 作或者访问内存 *** 作结束之后,该线程可以进入线程就绪队列上。

人们通常意义上的多线程指的是,由于CPU根据一定的线程调度算法来切换线程,所以在一个时间段上,可以看做很多线程在并发执行。

其实还是在某一个时间点上只有一个线程在运行罢了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12026114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存