我是多线程的新手,并尝试通过一个简单的程序来学习它,它将n加1并返回总和.在连续的情况下,对n = 1e5和2e5 main调用该sumFrom1函数两次; 在多线程情况下,使用两个线程创建,pthread_create并在单独的线程中计算两个和.多线程版本比顺序版本慢得多(参见下面的结果).我在12-CPU平台上运行它,线程之间没有通信.
多线程:
Thread 1 returns: 0
Thread 2 returns: 0
sum of 1..10000: 50005000
sum of 1..20000: 200010000
time: 156 seconds
Run Code Online (Sandbox Code Playgroud)
顺序:
sum of 1..10000: 50005000
sum of 1..20000: 200010000
time: 56 seconds
Run Code Online (Sandbox Code Playgroud)
当我在编译中添加-O2时,多线程版本(9s)的时间小于顺序版本(11s)的时间,但不如我预期的那么多.我总是可以打开-O2标志,但我对未经优化的情况下多线程的低速感到好奇.它应该比顺序版慢吗?如果没有,我该怎么做才能让它更快?
代码:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
typedef struct my_struct
{
int n;
int sum;
}my_struct_t;
void *sumFrom1(void* sit)
{
my_struct_t* local_sit = (my_struct_t*) sit;
int i;
int nsim = 500000; // Loops …Run Code Online (Sandbox Code Playgroud) 假设我有一个矩阵m和一个正整数向量v,我想要做的是得到一个新的矩阵,m_new并且m(比如说m[i, ])的每一行都被复制了v[i]几次m_new.例如:
m = matrix(1:6, nrow = 3)
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
v = c(3, 1, 2)
Run Code Online (Sandbox Code Playgroud)
而m_new应该是:
[,1] [,2]
[1,] 1 4 # m[1, ] is replicated by
[2,] 1 4 # v[1] = 3
[3,] 1 4 # times
[4,] 2 5
[5,] 3 6
[6,] 3 6
Run Code Online (Sandbox Code Playgroud)
一个for循环将使它适用于小案例: …