并行计算课程上机作业

第一节课:

估算面积分析 曲线y=-x4+x3+1与x轴围成的面积 图形范围: -1 < x < 2, 0 <= y < 2.2 整体面积为 6.6 划成小块,以块大小0.1*0.1为例 X方向分为30块 Y方向分为22块 计算每一块是否在图形中 面积=6.6*图形中的块数/总块数

参考代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//计算1/1+1/2+1/3+1/4+…+1/1000

double res;   // res是全局变量,用来计算最终的结果

typedef struct Args {
    long n;
    long begin;
    long step;
} Args;

void *cal(void *arg);

int main(int argc, char *argv[]) {
    long i;
    long n = atol(argv[1]);   // n为计算的数据量
    int np = atoi(argv[2]);        // np为线程数
    Args *arg;
    double* val;

    pthread_t *pid;         // 用于声明线程ID
    pid = (pthread_t *)malloc(np * sizeof(pthread_t));
    
    res = 0.0;
    for (i = 0; i < np; i++) {
        arg = (Args *)malloc(sizeof(Args));
        arg->n = n;
        arg->begin = i+1;
        arg->step = np;
        pthread_create(&pid[i], NULL, cal, (void *)arg);
    }
    for (i = 0; i < np; i++) {
        pthread_join(pid[i], (void *)val); // 用来等待一个线程的结束,线程间同步的操作
    }
    printf("233#%lf
", res);
    free(pid);
    return 0;
}

void *cal(void *_arg) {
    long i;
    double val;
    Args *arg = (Args *)_arg;
    
    val = 0.0;
    for (i = arg->begin; i <= arg->n; i += arg->step) {
        val += 1.0 / i;
    }
    res += val;
    return NULL;
}
View Code

我的代码

出错的地方:

(1)运行qsub命令时,报错script is written in DOS/Windows text format。

  解决办法:输入 dos2unix  <pbs-script-file> (就是dos2unix filename)

(2)使用argv传递5个参数时结果总是不对,错误的地方是错用了atol,我传入的参数时double型,需要使用atof来将字符串转换为double型,使用atol会转换成long型

原文地址:https://www.cnblogs.com/vactor/p/7737852.html