- 论坛徽章:
- 0
|
我最近在使用OPENMP在各个环境下做时间,其中在WINDOWS的vs2008以及linux环境下都很顺利,但是在AIX环境下,CPU使用率总是提不上去,后来通过修改pthread_attr_setscope设置在SYSTEM中竞争,略微好点,但是效果仍然不明显。准备转向自己动手做线程试试,不过原先做线程处理都是任务型的,对于算法的并行没有做过,也就是说想用线程对循环计算进行并行化,我的数据是一个8192 * 8000的short数据,而且还分7层,所以是个数组,一次数组下标是很重要的,我就做了一个例子来确定线程计数器的唯一性(主要怕出现计数下标不唯一,造成的计算结果错误),我的实验程序如下:
- #include <stdio.h>
- #include <string.h>
- #include <strings.h>
- #include <stdlib.h>
- #include <pthread.h>
- int count = 1000000;
- int k = 0;
- pthread_mutex_t mutex;
- void *thr_fn(void *arg)
- {
- int tmp;
- pthread_detach(pthread_self());
- pthread_mutex_lock(&mutex);
- k++;
- tmp = k;
- pthread_mutex_unlock(&mutex);
- int kk = 0;
- for(int z = 0; z < count; z++)
- {
- kk = z * z /kk + kk;
- }
- printf("%05d end pid:%u tid:%u\n", tmp, getpid(), pthread_self());
- pthread_exit(0);
- return NULL;
- }
- int main()
- {
- int err;
- int i = 0;
- pthread_t tid;
- for(; i < 10000; i++)
- {
- printf("i = [%d]\n", i);
- err = pthread_create(&tid,NULL,thr_fn, NULL);
- if(err=0)
- printf("can't create thread:%s\n",strerror(err));
- }
- sleep(10);
- exit(0);
- }
复制代码 内部使用线程锁作为保护机制,但是结果发现仍然有8个点被击穿了
num = [227]
num = [232]
num = [2770]
num = [5065]
num = [5242]
num = [7514]
num = [8446]
num = [9487]
有重复,难道线程内部不能使用流水呀,计数值么?
另外,main中的i是不能作为计数值参数传递的,以为竞争更厉害。 |
|