- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要使用具有 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/
我在 C++ 中使用 mpir 库时遇到问题。是否可以从函数返回 mpz_t 值?当我尝试这样做时,出现以下错误: RSA.cpp:50:36: error: ‘HASHtemp’ declared
我看到了问题mpz_t to unsigned long long conversion (gmp lib)的帖子Chris Jester-Young 给了我答案 mpz_t ull2mpz(unsi
我正在尝试让服务器和客户端(用 C 编写)交换 mpz_t 值。该程序使用 GMP 库和椭圆曲线库的一些函数。问题在于客户端生成的值与服务器接收到的值不同。您知道为什么会发生这种情况吗? int se
我对大数字使用 mpz_t。我需要将 mpz_t 转换为二进制表示形式。我尝试使用 mpz_export,但返回的数组仅包含 0。 mpz_t test; mpz_init(test); string
我需要将 mpz_t 转换为包含数字的 int 数组。例如 mpz_t t1; mpz_set_si(t1,12345); int digits[]; mpz_t2digits(t1,digits);
我无法找到 gmpxx 是如何存储 mpz_t 结构的。因此,获取存储为 mpz_t 的数字的最高有效字节的唯一方法是使用 mpz_get_str 方法,但我预计它会非常慢。 您知道更有效(和简单)的
嘿,我正在尝试将我编写的用于生成代表 Pascal 三角形的长整数数组的函数转换为返回 mpz_t 数组的函数。但是使用以下代码: mpz_t* make_triangle(int rows, int
有没有一种方法可以将 string,或者在我的例子中是 char array,从 gmplib 转换为 mpz_t 类型。有没有类似sscanf函数的? C 编程语言的任何内容都是相关的。 最佳答案
我目前正在学习 libgmp,为此我正在编写一个小程序来查找质因数。我的程序调用一个函数,该函数用不同数量的 mpz_t 整数填充数组,给定数字的质因数,我需要返回。我计划将最后一个元素设置为 NUL
我正在使用 GMP,我需要一个 mpz_t 数组。 sizeof(mpz_t) 给出 16,但我存储的数字比这大得多。 mpz_t 是否“就地”增长,即。 e.我是否需要分配更多内存并允许就地增长,或
我有一个这样的结构: typedef struct{ size_t length; // length of the array size_t numbits; // number o
来源: //$ DO DECLARATION #define VEC_MAX_SIZE 600000 mpz_t Vec[ VEC_MAX_SIZE ]; //$ DO INITIALIZATION
假设我知道我的号码可能有多少位数(并且我想第一次分配合适的空间量,我如何计算我需要分配的字节数?我想我总是可以设置值是 1*10^(num digits),然后是 0,但感觉不对,好像我没有达到目的。
我在 C 中使用 GMP。是否可以将 mpz_t 设置为浮点值? 最佳答案 是的,有一个函数 mpz_set_d 可以用于此目的: void mpz_set_d (mpz_t rop, double
有人知道为什么第二次调用 mpz_set_str() 后会导致段错误吗?如何从 str 初始化两个以上的 gmp int? #include #include int main(int argc,
我在编译代码时从 g++ 得到以下错误: main.cpp:4:35: error: ‘createBInt’ declared as function returning an array
在 C++ 中使用 GMP 库。我有一个函数接收指向 mpz_t 数字的指针并从中设置另一个 gmp_z 数字。我需要一种方法来检查 *_amount 之前是否已经初始化。 void f(mpz_t*
void decrypt_cert(mpz_t decrypted_cert, cert_message *cert, mpz_t key_exp, mpz_t key_mod) { mpz_
我们如何将 mpz_t 转换为 std::string? mpz_t Var; // Var = 5000 mpz_init_set_ui( Var, 5000 ); std::string Str
如何将 mpf_t 或 mpz_t 类型的 GMP 对象保存在 C 语言文件中?或者如何访问为这些类型分配的内存块,以便将它们直接写入文件? 编辑 fwrite(&gmp_obj->_mp_size,
我是一名优秀的程序员,十分优秀!