gpt4 book ai didi

c - 使用 OpenMP 和 mpz_t malloc 导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:06 25 4
gpt4 key购买 nike

我需要使用具有 2^15 大小的 mpz_t 数组的 OpenMP 编程来并行执行以下代码:

#pragma omp parallel for private(j,temp3)
for(j=Real;j<LL;j++)//l
{
for(__int64_t k=0;k<=((j/(Real*1.0))/(log(sieve[i])/log(2.0)));k++)//l5
{
if((((j/(Real*1.0)-k*(log(sieve[i])/log(2.0)))<LL))&&(((j/(Real*1.0)-k*(log(sieve[i])/log(2.0)))>0)))// can log() use __int64_t?
mpz_add(temp3[j],temp3[j],temp2[(int)floor((j-k*Real*(log(sieve[i])/log(2.0))))]);
}
mpz_add_ui(temp3[j],temp3[j],(int)floor(((j/(Real*1.0))/(log(sieve[i])/log(2.0)))));
}

我像这样初始化数组 temp3:

mpz_t temp3[LL];

它会导致段错误。所以我试着这样写:

mpz_t *temp3=(mpz_t *)malloc(sizeof(mpz_t)*LL);

也会导致Segmentation fault,malloc操作不成功。怎么解决?谢谢!

最佳答案

当 temp3 是一个数组 (mpz_t temp3[ll]) 并且您将其声明为私有(private)时,OpenMP 会为每个线程创建该数组的私有(private)版本(即它从每个线程)。但是,在第二种情况下,使用 malloc temp3 只是一个指针(数组和指针不是一回事),当您传递私有(private)指针时,OpenMP 只会为每个线程制作私有(private)版本的指针(它不分配内存)。

在第一种情况下,崩溃可能是由于数组大于堆栈大小。在第二种情况下,指针的私有(private)版本永远不会被初始化(因为它们会被 firstprivate 初始化)所以它们指向未知的内存地址,这可能会导致崩溃。

解决方法很简单。 不要将 temp3 声明为私有(private)。它应该被分享。

如果您使用 firstprivate,您可以尝试将 temp3 设为私有(private),但我认为这不是一个好主意。

#include <stdio.h>
#include <stdlib.h>
int main() {
int x[10];
printf("%p\n", x);
#pragma omp parallel private(x)
{
printf("%p\n", x);
}

int* y = (int*)malloc(10*sizeof(int));
#pragma omp parallel firstprivate(y)
{
printf("%p\n", y);
}
}

关于c - 使用 OpenMP 和 mpz_t malloc 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com