for里面嵌了汇编,就不能用omp了

whycadi 2007-07-18 09:14:56
但是我很懒,我不想自己写多线程的管理程序,怎么办?
其实很简单,编个子函数,把循环分成几段,子函数里用汇编完成一段,外面用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];
}
...全文
248 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧