for里面嵌了汇编,就不能用omp了
但是我很懒,我不想自己写多线程的管理程序,怎么办?
其实很简单,编个子函数,把循环分成几段,子函数里用汇编完成一段,外面用for循环调用,这个for循环就可以用 #pragma omp paralle for了 ^.^
例:
#define n 100000000
//定义分块数
#define block 20
#define cpunum 2
float data[n+3];
int maxpos=0;
float max=0;
int FindMax()
{
int i;
float maxlist[cpunum]={0};
int poslist[cpunum];
omp_set_num_threads(cpunum);
//把一个for循环分成若干个块,一次循环调用一块
#pragma omp parallel for schedule(guided)
for(i=0;i<block;i++){
FindMaxSub(i,maxlist,poslist);
}
for(i=0;i<cpunum;i++){
if(maxlist[i]>max){
max=maxlist[i];
maxpos=poslist[i];
}
}
return 0;
}
//用汇编编写的子函数,每次完成一块
int FindMaxSub(int start,float* maxlist,int* poslist){
int i;
int threadnum;
threadnum=omp_get_thread_num();
_asm{ XORPS xmm3,xmm3
xorps xmm7,xmm7
}
start=start*n/block;
for(i=start;i<start+n/block;i+=4){
_asm{
mov ecx,[i]
movups xmm2,[data+ecx*4]
movups xmm1,[data+ecx*4+4]
movss xmm6,[i]
mulps xmm1,xmm2
movups xmm2,[data+ecx*4+8]
movups xmm5,[data+ecx*4+12]
shufps xmm6,xmm6,0
mulps xmm2,xmm5
movaps xmm4,xmm3
mulps xmm1,xmm2
cmpltps xmm4,xmm1
maxps xmm3,xmm1
andps xmm6,xmm4
maxps xmm7,xmm6
}
}
__declspec(align(16))int v[4];
__declspec(align(16))float f[4];
_asm{
movaps [v],xmm7
movaps [f],xmm3
}
for(i=0;i<4;i++){
if(f[i]>maxlist[threadnum]){
maxlist[threadnum]=f[i];
poslist[threadnum]=v[i]+i;
}
}
return poslist[threadnum];
}