在Xeon E5 2650 v4上不能同时启动超过12个线程

huyonghuyong 2017-08-23 09:38:39
大家好,最近买了一台联想至强E5 2650 v4服务器,就想把之前的多线程图像处理服务程序搬到至强上来试试,毕竟12核24线程。直接开了20个线程测试并发效果,结果大跌眼镜还没有i7运行效果好。开的20个线程只有12个线程同时跑起来了,其他核心一动没动。使用intel parallel studio分析,尝试了各种优化办法都没有找到原因。同时用Qt4.8写了一个模拟程序之前服务程序的多线程操作方式,在任务处理时间小于window时间片的情况下仍然不能同时将20个线程运行起来。demo代码如下
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QSemaphore>
#include <QMutex>
#include <Windows.h>
#define THREAD_NUMBER 20
QSemaphore m_producer;
QSemaphore m_customer;
volatile long long GolbalSum = 0;
class MyThread: public QThread
{
public:
MyThread(QObject *parent=0);
~MyThread();
void run();
public:
long long *m_sum;
bool m_bExit;
QMutex m_singleTask;
QMutex m_TaskDone;
};
MyThread::MyThread(QObject *parent/* =0 */):QThread(parent)
{
m_sum = 0;
m_bExit = false;
m_TaskDone.lock();
start();
}
MyThread::~MyThread()
{
m_bExit = true;
m_singleTask.unlock();
}
void MyThread::run()
{
m_singleTask.lock();
m_singleTask.lock();
while (!m_bExit)
{
if (!m_producer.tryAcquire(1, 1))
{
continue;
}
// handle the task
for (int i = 0; i < 500000; ++i)
(*m_sum)++;

m_customer.release();
m_singleTask.lock();
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int loopCnt = 1000;
MyThread threads[THREAD_NUMBER];
long long threadsSum[THREAD_NUMBER];
LARGE_INTEGER freq_detect, before_detect, after_detect;
QueryPerformanceFrequency(&freq_detect);
while(1)
{
for (int i = 0; i<THREAD_NUMBER; ++i)
{
threads[i].m_sum = &threadsSum[i];
threads[i].m_singleTask.unlock();

}
if (0)//loopCnt-- <= 0)
{
for (int i = 0; i<THREAD_NUMBER; ++i)
{
threads[i].m_bExit = true;
threads[i].wait();
}
break;
}
Sleep(8);

QueryPerformanceCounter(&before_detect);
m_producer.release(THREAD_NUMBER);
m_customer.acquire(THREAD_NUMBER);
QueryPerformanceCounter(&after_detect);
printf("%f %f %f\t", before_detect.QuadPart*1e3/freq_detect.QuadPart,
after_detect.QuadPart*1e3/freq_detect.QuadPart, (after_detect.QuadPart-before_detect.QuadPart)*1e3/freq_detect.QuadPart);
for (int i=0; i<THREAD_NUMBER; ++i)
{
GolbalSum += *threads[i].m_sum;
}
printf("Current sum:%I64d\n", GolbalSum);
}
//return a.exec();
}

在使用setthreadaffinity()函数情况下,将线程绑定到固定核心上是能够将20个线程同时调度起来的,但是会受到系统中的其他进程的影响,处理时间不稳定。
不知道各位有没有对多线程并发比较熟悉的,希望能得到一点意见,感谢。
...全文
935 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
GPU服务器招标参数 硬件要求 1、一体式GPU计算平台,4U高度; 2、2*INTEL XEON E5 2660V4 2.0G/睿频3.2G/14核28线程/35M/9.6GT/120W /8*32GB DDR4 ECC REGS 2400 服务器内存/8块*NVIDIA GTX 1080TI 11GB GPU 高性能运算卡/3块*三星 850pro 1TB企业级 SSD固态硬盘/4块1.2TB SAS HDD/ LSI 9261-8I RAID卡 支持RAID 0.1.5.10.50.60含线/ intel 双口 万兆 光纤网卡/PDU电源线,数据线,配套/Ubuntu 64位系统/ 4*1600w以上电源 服务器电源80 PLUS 4U服务器电源 同时支持8块GPU 卡/原厂针对本项目的授权原件,质量管理体系符合:GB/T19001- 2008/ISO9001:2008标准NVIDIA/SUPERMICRO官方认证合作伙伴,提供原厂承诺函。 3、设备访问处理:本系统既支持本地环境使用,同时也支持由外部访问。支持接入集群 4、供电模块:为了确保平台的稳定可靠运行,单节点需要冗余供电模块; 5、跨节点链路带宽:万兆光纤; 6、产品结构:4U 7、其他要求:为了确保平台的品质,需要经过至少24小时负载99%的耐高温测试,72小 时不宕机测试;产品通过中国国家强制CCC认证;开机显示原厂LOGO。 软件要求: 兼容Ubuntu Server LTS 16.04.3 预装CUDA 8.0.61及nvidia 384/387版本驱动 资质要求: 设备生产厂家具有NVIDIA认证的技术工程师和销售工程师 设备生产厂家具有SUPERMICRO认证的代理资质 投标厂商需通过ISO9001:2008质量体系认证 投标时必须提供生产厂家针对本项目出具售后服务承诺书原件;必须提供原厂针对本 项目的授权原件; 中标单位在同客户签订合同后必须提供与招标技术要求及功能符合的全部设备一套进 行整体性能检测与招标文件核对,作为项目合同签订的标准依据,如出现所提供设备不 符招标要求或无法提供所有设备,不予验收; 技术服务要求 1. 设备安装调试: 在买方指定的地点完成安装调试,并配合买方进行测试验收。 2. 质保期为验收合格后不低于36个月,终身维修,质保期外只收硬件成本费, 提供服务升级、固件升级。 3. 维修响应时间: 接到维修通知后,1个工作日内作出响应,3个工作日内到场排除故障。 4. 交货地点:用户指定位置。 ----------------------- GPU服务器参数全文共2页,当前为第1页。 GPU服务器参数全文共2页,当前为第2页。

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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