1. 程式人生 > >spinlock在多核處理器上的效能比較

spinlock在多核處理器上的效能比較

#define _GNU_SOURCE
#include <sched.h>

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/syscall.h>
#define MAX_NR 0xffffff

unsigned long counter = 0;
pthread_spinlock_t lock;

static void setaffinity(int cpu)
{
        cpu_set_t mask;

        pid_t pid = syscall(__NR_gettid);

        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        sched_setaffinity(pid, sizeof(mask), &mask);
}

static void* add_counter(void *pcore)
{
    setaffinity((int)(long)pcore);

    while (counter == 0)
        ;

    while (counter < MAX_NR)
{
        pthread_spin_lock(&lock);
        counter++;
        pthread_spin_unlock(&lock);
    }
}

int main(int argc, char *argv[])
{
    pthread_t threads[4];
    unsigned long i;
    pid_t pid;
    struct timespec start, end;
    unsigned long long diff_ns;

    if (pthread_spin_init(&lock,
PTHREAD_PROCESS_PRIVATE)) {
        puts("pthread_spin_init");
        exit(-2);
    }

    for (i=0; i<4; i++) {
        if (argc == 2 && argv[1][0] == 's') {
    //    At same physical socket

        if (pthread_create(threads+i, NULL, add_counter, (void*)(i*2))) {
            puts("pthread_create");
            exit(-1);
        }
        } else {
    //    Across two physcial sockets

        if (pthread_create(threads+i, NULL, add_counter, (void*)(i))) {
            puts("pthread_create");
            exit(-1);
        }
        }
    }
    usleep(5000000);

    clock_gettime(CLOCK_REALTIME, &start);
    counter = 1;
    for (i=0; i<4; i++) {
        if (pthread_join(threads[i], NULL)) {
            puts("pthread_join");
            exit(-1);
        }
    }
    clock_gettime(CLOCK_REALTIME, &end);

        if (start.tv_sec == end.tv_sec)
                diff_ns = end.tv_nsec - start.tv_nsec;
        else {
                diff_ns = 1000000000ULL - start.tv_nsec;
                diff_ns += end.tv_nsec;
                diff_ns += 1000000000ULL * (end.tv_sec - start.tv_sec - 1);
        }
        
        printf("%llums\n", diff_ns/1000000ULL);

    pthread_spin_destroy(&lock);

    return 0;
}

相關推薦

spinlock處理器效能比較

#define _GNU_SOURCE#include <sched.h>#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <stdlib.h>#includ

處理器&類UNIX系統 -> 之程序和執行緒效能比較

網路上有很多討論關於在*NIX系統在SMP環境下到底是應該用多執行緒還是多程序, 到底哪一個有更好的效能,  比如有很多人認為考慮到linux使用1-1執行緒模型(對核心來說, 執行緒就是一個程序)並且系統已經為程序處理做了很多優化,效率提升, 所以在liunx SMP環

Linux 的 Spinlock 在 MIPS 處理器中的設計與實現

引言 隨著科技的發展,尤其是在嵌入式領域,高效能、低功耗的處理器成為眾多廠商追逐的目標,但是由於技術和工藝的瓶頸,試圖在單核處理器上達到這樣的目標變得越發困難,於是人們提出了多核處理器的概念。多核處理器的核心思想是一個處理器中包含若干個核(或執行緒),所有核(或執行緒)之間共享 IO、Cache、記憶體等資

C++ openmp並行程序在linux如何最大化使用cpu

.com 核心 程序 cpu pragma -m ron amp 指令 以上代碼中,#pragma omp parallel for 這一行的作用即是調用openmp的功能,根據檢測到的CPU核心數目,將for (i = 0; i < 1000000000; i++)

[py]你真的了解處理器嗎? 了解線程

註意 董事會 fusion 整體 用戶 繼續 高速 多核處理器 真的 你真的了解多核處理器嗎? 1.雙核≠雙性能 多核不一定會使你的手機或電腦速度更快,但它將提高你的PC的整體性能,這是一個有所不同的細微的技術特色。多核處理器的性能提升並不是簡單CPU核心的倍數,因為受到

CPUpython線程並行的一個假象

llb 使用 發展 重要 multi 定律 依賴 並發 操作 引用鏈接:http://www.cnblogs.com/pengyingh/articles/6586760.html GIL 與 Python 線程的糾葛 GIL 是什麽東西?它對我們的 python 程序會產

[轉帖]AMD、英特爾為何爭相走向膠水處理器?真相在此

AMD、英特爾為何爭相走向膠水多核處理器?真相在此 膠水多核到底好不好?這個事不是簡單一句話能說明的,今天的超能課堂裡我們就來聊聊MCM膠水多核技術的過去及未來。 作者:孟憲瑞來源: 超能網|2018-11-21 15:25  收藏

DVFS及處理器功耗優化技術詳解

    概述         降低嵌入式系統功耗有多種方法,其中動態電源管理(DPM)和動態電壓頻率調整技術(DVFS)是降低系統功耗的兩種關鍵技術。其中動態電源管理主要依據裝置工作負載的變化切換器工作狀態以達到系統功耗最小化。本篇部落格則主要從DVFS技術做詳細的介紹。DV

MySQL利用處理器

在工作中可能遇到這樣的情況,隨著業務的增長,使用者量也在逐漸增長,終究有一天,一到高峰期,資料庫伺服器CPU利用率直飈100%。 最簡單的做法就是直接提升硬體效能,簡單粗暴,直接有效。 假如我們最開始的伺服器CPU核數是4,然後我們覺得4個有點扛不住,那就直

作業系統與處理器

這篇文章解答了我心中的疑問,那就是作業系統會自動排程cpu資源來處理多程序,多執行緒的併發。      早在上世紀90年代末,就有眾多業界人士呼籲用CMP(單晶片多處理器)技術來替代複雜性較高的單執行緒CPU。IBM、惠普、Sun等高階伺服器廠商,更是相繼推出了多核伺服器CPU。不過,由於伺服器價格高、應

處理器處理器的區別

最近遇到了一個讓人很是疑惑的問題,然後寫出來供大家解疑: 多個處理器&多核處理器? 多個處理器:多個單核處理器,就是說電腦和處理器有多個,但是這個電腦的處理器是單核的; 多核處理器:單個多核處理器,也就是說電腦有一個處理器,但是這個處理器是多核的;      

MySQL利用處理器 innodb_read_io_threads

在工作中可能遇到這樣的情況,隨著業務的增長,使用者量也在逐漸增長,終究有一天,一到高峰期,資料庫伺服器CPU利用率直飈100%。最簡單的做法就是直接提升硬體效能,簡單粗暴,直接有效。假如我們最開始的伺服器CPU核數是4,然後我們覺得4個有點扛不住,那就直接給他搞16個核。這下

ARM處理器啟動過程分析

說明: 該流程圖按照程式碼執行時間順序劃分為4部分: 1.     Bootloader在圖片上半部,最先啟動; 2.     Kernel在圖片下半部,由bootloader引導啟動; 3.CPU0執行流程在圖片左半部,bootloader程式碼會進行判斷,先行啟

異構處理器開發嵌入式應用入門

By Toradex Raul Rosetto Mu?oz 1). 簡介 每天都有新的異構多核處理器/片上系統 SoC 面市。在 SoC 上整合微控制器和外設控制核正變得越來越普遍,看看最新發布的 NXP? :i.MX 6SoloX、i.MX7 和即將面世的 i.MX 8。

執行緒與處理器 SMP 分析

首先分析執行緒的優勢: 1、提高程式的併發性(執行緒級並行,而非指令級並行); 2、一個程序內的所有執行緒共享所有資源; 3、切換執行緒的代價下; 4、互動式程式可以通過多執行緒方式改善響應時間。 多執行緒實現的方式: 1、程式採用多執行緒設計方案; 2、多核處理器為單一的

處理器系統

多執行緒支援多個執行緒以重疊方式共享單個處理的功能單元,但是開發執行緒級並行的一般方法是使用多處理器。 實現多執行緒的硬體方法主要有三種: 細粒度多執行緒, Fine-grained (interleaved) multithreading,每個時鐘週

創龍TI AM5728異構工業控制處理器

mco 教程 blog 工業機器人 image sgx 技術分享 ESS uart 由廣州創龍自主研發的SOM-TL5728核心板,基於TI-AM5728浮點雙DSP+雙ARM核,大小僅86.5mm*60.5mm,性能強、成本低、性價比高。采用沈金無鉛工藝的10層板設計,專

效能優化

設定核心引數isolcpus 如4核cpu隔離第2,3,4個核: isolcpus=1,2,3 系統內仍可以通過taskset講程序繫結到第2,3,4個核 如果每個核只跑一個執行緒,可以設定核心在該核心tickless cmdline增加引數no_fullhz, rcu_nocbs 禁用irqb

[效能優化]通過Shell實現將程序負載均衡到CPU

有時候,由於架構設計或其他業務本身特點原因,導致有些應用使用CPU很不均衡,所以業務處理集中在一個CPU上,而其它CPU閒得在睡覺。這裡有個簡單的優化方案實現將各個執行緒繫結到到多個CPU,從而實現效能的提高。 雖然CPU是一個不錯的思路,但是不是殺手鐗,其效能能提高多少依賴於各個執行緒的效能分佈是

MySQL並行寫入、查詢效能調優(CPU)

[html] view plain copy [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock based