测试树莓派是否支持OpenMP多核并行操作的代码

编译makefile生成test可执行文件


#bulid for stp_test
#CROSS	=arm-hisiv300-linux-    #HI3536平台编译器
CROSS	=arm-linux-gnueabihf-   #树莓派的编译器

CC	= $(CROSS)g++
#C语言编译程序。默认命令是“cc”,即“g++”
LD	= $(CROSS)ld
#LD链接器的名字,缺省值是ld
AR	= $(CROSS)ar	
#AR函数库打开包程序。默认命令是“ar”

CFLAGS	+= -g -Wall -O2 -fopenmp -mfpu=neon -ldl 
#-g 在可执行程序中包含标准调试信息
#-O0 O1 O2 O3 OS ,不同的优化程度
#-w	关闭所有告警
#-Wall 允许发出Gcc提供的所有有用的报警信息
#-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
#-fopenmp 
#-mfpu=neon 使用NEON技术
#-ldl 链接dl库

HOME_DIR = $(PWD)
SRC_DIR := $(HOME_DIR)
INCLUDE_DIR := $(HOME_DIR)/include

AFLAGS	+=	-arv
#编译汇编语言源文件de选项

CFLAGS  += 	-I$(SRC_DIR)
CFLAGS  += 	-I$(INCLUDE_DIR)
CFLAGS  += 	-I$(INCLUDE_DIR)/api
CFLAGS  += 	-I$(INCLUDE_DIR)/inner
CFLAGS  += 	-I$(INCLUDE_DIR)/mkp
#-I 在头文件的搜索路径列表中添加dir目录

LIBS := $(HOME_DIR)/lib/libmed.a \
	$(HOME_DIR)/lib/libmpi.a \
	$(HOME_DIR)/lib/libhdmi.a \
	$(HOME_DIR)/lib/libdnvqe.a \
	$(HOME_DIR)/lib/libive.a \
	$(HOME_DIR)/lib/libjpeg.a \
	$(HOME_DIR)/lib/libjpeg6b.a \
	$(HOME_DIR)/lib/libtde.a \
	$(HOME_DIR)/lib/libupvqe.a \
	$(HOME_DIR)/lib/libVoiceEngine.a \
	$(HOME_DIR)/lib/libpciv.a \
	$(HOME_DIR)/lib/alg/libgsfacedt.a \
	$(HOME_DIR)/lib/alg/libopencv_highgui.a \
	$(HOME_DIR)/lib/alg/libopencv_imgproc.a \
	$(HOME_DIR)/lib/alg/libopencv_video.a \
	$(HOME_DIR)/lib/alg/libopencv_core.a \
	$(HOME_DIR)/lib/alg/liblibpng.a \
	$(HOME_DIR)/lib/alg/liblibjpeg.a \
	$(HOME_DIR)/lib/alg/libzlib.a
#.a 静态库 .so 动态库

mSRCS = $(SRC_DIR)/test.c
#源文件为test.c

OBJS = $(patsubst %.c, %.o, $(mSRCS))
#OBJS = test.o

TARGET := $(PWD)/test
#目标文件 TARGET = test



#hs-build: $(TARGET)

$(TARGET) :$(OBJS)
	$(CC) $(CFLAGS) -o $@ $(mSRCS)  -lpthread  -lm  -ldl -Bstatic  $(LIBS)    #-lz
#  $@ 表示当前的目标文件,即TARGET = test

clean: 
	rm -f $(OBJS)
	rm -f $(TARGET)

编译所用的test.c源码


#include "VideoAnalyse.h"
#include 
#include 
#include 
#include 
#include 
#include 

void test(void)
{
	struct timeval start,end; //定义两个时间变量用来表示开始和结束
	int j=500000000;
	gettimeofday(&start,NULL);	//获得当前的时间,并把它存放到start中
	/*
	while (j--)
	{
		int a = 0;
		int i;	
		for(i=0;i<500000000;i++)
		{
			a = a +i;
		}
		for(i=0;i<500000000;i++)
		{
			a = a +i;
		}
		//printf("%d: a = %d\n",  a);
	}
	*/
	printf("numthread=%d \n",omp_get_thread_num());
	gettimeofday(&end,NULL);	//获得当前的时间,并把它存放到end中
	printf("num_procs=%d thread_num=%d runtime=%ds:%dus\n",omp_get_num_procs(),omp_get_thread_num()
		,end.tv_sec -start.tv_sec, end.tv_usec - start.tv_usec);
}


void *thfun_1(void *arg)
{   
	int i;
	printf("new  thread 1 start!\n");

	for(;;)
		{
			for(i=0;i<10000000;i++);
			for(i=0;i<10000000;i++);
			for(i=0;i<10000000;i++);
		}
	printf("new  thread 1 end!\n");

    return ((void *)0);

}

void *thfun_2(void *arg)
{     
	int i;
	printf("new  thread 2 start!\n");

	for(;;)
		{
			for(i=0;i<10000000;i++);
			for(i=0;i<10000000;i++);
			for(i=0;i<10000000;i++);
		}
	printf("new  thread 2 end!\n");	

    return ((void *)0);

}

void *thfun_3(void *arg)
{     
	int i;
	printf("new  thread 3 start!\n");

	for(;;)
		{
			for(i=0;i<10000000;i++);
		}
	printf("new  thread 3 end!\n");

    return ((void *)0);

}

void *thfun_4(void *arg)
{     
	int i;
	printf("new  thread 4 start!\n");

	for(;;)
		{
			for(i=0;i<10000000;i++);
		}
	printf("new  thread 4 end!\n");

    return ((void *)0);

}



int main(int argc, char *argv[])
{
	int j,ret;
	pthread_t pthid;
	struct timeval start,end;
	

#if 1
	/*创建四个线程,成功返回0,出错返回错误码
	第一个参数为指向线程标识符的指针。
	第二个参数用来设置线程属性。
	第三个参数是线程运行函数的起始地址。
	最后一个参数是运行函数的参数。*/
	ret=pthread_create(&pthid,NULL,thfun_1,(void *)"testTh1");	
	if(ret!=0)
		{
		  perror("can'tcreat thread 1 ");
		  exit(EXIT_FAILURE);
	}	

	ret=pthread_create(&pthid,NULL,thfun_2,(void *)"testTh2");
	if(ret!=0)
		{
		  perror("can'tcreat thread 2 ");
		  exit(EXIT_FAILURE);	
	}
	

	ret=pthread_create(&pthid,NULL,thfun_3,(void *)"testTh3");
	if(ret!=0)
		{
		  perror("can'tcreat thread 3 ");
		  exit(EXIT_FAILURE);
	}

	ret=pthread_create(&pthid,NULL,thfun_4,(void *)"testTh4");
	if(ret!=0)
		{
		  perror("can'tcreat thread 4");
		  exit(EXIT_FAILURE);	
	}
#endif	

	while(1)
	{	

#pragma omp parallel sections 
{

#pragma omp section
		printf("section 1 ThreadId = %d\n", omp_get_thread_num());
/*
#pragma omp section 
		for(j=0;j<3;j++)
		{
		    	test();	
		 }
*/
}

/*
	    gettimeofday(&start,NULL);
#pragma omp parallel for 
		for(j=0;j<8;j++)
			{		
		 	test();		
			}
		gettimeofday(&end,NULL);
		printf("Total time runtime=%ds:%dus \n",end.tv_sec -start.tv_sec, end.tv_usec - start.tv_usec);
*/		

	}
	exit(0);

	return 0;
}




你可能感兴趣的:(测试树莓派是否支持OpenMP多核并行操作的代码)