【发布时间】:2017-01-01 12:42:02
【问题描述】:
我目前有一个使用 Pthreads 编码的多线程 C 程序,它使用 2 个线程。我想增加编号。线程和测量速度这样做。我想以自动化方式运行我的代码,其中没有。使用的线程数不断增加,我想以图形方式显示我的代码的运行时间。如果我能知道如何做到这一点,尤其是如何自动化整个过程并以图形方式绘制它,我会很高兴的。这是我的代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 2
#define VECTOR_SIZE 40
struct DOTdata
{
/* data */
long X[VECTOR_SIZE];
long Y[VECTOR_SIZE];
long sum;
long compute_length;
};
struct DOTdata dotstr;
pthread_mutex_t mutex_sum;
void *calcDOT(void *);
int main(int argc, char *argv[])
{
long vec_index;
for(vec_index = 0 ; vec_index < VECTOR_SIZE ; vec_index++){
dotstr.X[vec_index] = vec_index + 1;
dotstr.Y[vec_index] = vec_index + 2;
}
dotstr.sum = 0;
dotstr.compute_length = VECTOR_SIZE/NUM_THREADS;
pthread_t call_thread[NUM_THREADS];
pthread_attr_t attr;
void *status;
pthread_mutex_init(&mutex_sum, NULL);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
long i;
for(i = 0 ; i < NUM_THREADS ; i++){
pthread_create(&call_thread[i], &attr, calcDOT, (void *)i);
}
pthread_attr_destroy(&attr);
for (i = 0 ; i < NUM_THREADS ; i++){
pthread_join(call_thread[i], &status);
}
printf("Resultant X*Y is %ld\n", dotstr.sum);
pthread_mutex_destroy(&mutex_sum);
pthread_exit(NULL);
}
void *calcDOT(void *thread_id)
{
long vec_index;
long start_index;
long end_index;
long length;
long offset;
long sum = 0;
offset = (long)thread_id;
length = dotstr.compute_length;
start_index = offset * length;
end_index = (start_index + length) - 1;
for(vec_index = start_index ; vec_index < end_index ; vec_index++){
sum += (dotstr.X[vec_index] * dotstr.Y[vec_index]);
}
pthread_mutex_lock(&mutex_sum);
dotstr.sum += sum;
pthread_mutex_unlock(&mutex_sum);
pthread_exit((void *)thread_id);
}
我想增加我的 NUM_THREADS 参数并在每次增加后运行它,记录每次增加后的执行时间并绘制执行时间与线程数的关系图。
【问题讨论】:
-
哪个操作系统?为了明确一点,您是否已经设法让您的应用程序使用任意数量的线程,或者您也在为此寻求帮助?
-
我编写了我的代码,它使用 n 个线程,尽管在整个执行周期中是一个常数。我的操作系统是 macOS Sierra。
-
我可以改变我的 NUM_THREADS 参数并单独运行它,但我想自动化该过程,记录每个循环的执行时间并以图形方式显示。
-
您可以修改代码以从命令行或标准输入中获取线程数。然后你可以编写一个脚本来多次调用你的程序。我不精通Mac,但我认为你可以使用Bash 和
time来衡量你的程序。 -
或者不修改程序,更简单的解决方案是让您的脚本将
NUM_THREADS作为宏提供给编译器。在 GCC 中,您可以为此使用选项-D。编写一个脚本,用不同数量的线程编译你的程序,运行它,并测量运行时间。
标签: c multithreading pthreads