Tag: 内存管理

使用c进行OpenMP优化

我应该优化下面的代码,使其使用openMP和内存阻塞运行至少16倍。 到目前为止,我只能想到使用下面的简单语句来折叠for循环。 这使它运行速度提高了3倍。 有什么想让它接近16? int i,j; #pragma omp parallel for collapse(2) //my inserted code for (i = 0; i < MSIZE; i++) for (j = 0; j < MSIZE; j++) d[i][j] = c[j][i];

C Sysmalloc断言失败

我在运行C程序时收到以下sysmalloc错误。 malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) – 1) * 2])) – __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long) ((((__builtin_offsetof (struct malloc_chunk, fd_nextsize)) +((2 * (sizeof(size_t))) – 1)) & ~((2 * (sizeof(size_t))) – 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == […]

c中的结构打印字段(动态内存分配)

我是C的菜鸟,并创建这个程序来帮助我学习。 目的是将足球运动员添加到球队并打印信息。 我正在尝试打印我的俱乐部结构的字段,但是当我的程序进入我的打印方法时,我的所有值都是垃圾或地址。 我怎样才能获得“真实”的价值观 #include #include #include #define SIZE 8 typedef struct player { int id; char *position; } Player; typedef struct club { int size; Player *team[SIZE]; } Club; Player *create_player(int id, const char *description); void create_team(Club *club); void print_club(const Club *club); void add_player_to_club(Club *club, int id, const char *position); int main() { Club […]

在动态矩阵上设置指针

我正在尝试制作1字节元素的动态大小矩阵。 为此,我定义了以下function。 当我尝试将矩阵的第一个“nrows”元素设置为指向相应的行时(因此我可以执行矩阵[i] [j])时出现问题。 看起来像matrix[i] = matrix[nrows + i * single_row_elements_bytes]; 不能正常工作(程序编译但会引发核心段违规错误)。 我怎样才能做到这一点? uint8_t **NewMatrix(unsigned nrows, unsigned ncols) { uint8_t **matrix; size_t row_pointer_bytes = nrows * sizeof *matrix; size_t single_row_elements_bytes = ncols * sizeof **matrix; matrix = malloc(row_pointer_bytes + nrows * single_row_elements_bytes); unsigned i; for(i = 0; i < nrows; i++) matrix[i] = matrix[nrows + […]

由于在更改巨大页面分配的大小时initialize()函数导致的分段错误

当我使用大页面分配的内存大小时,我在程序中遇到分段错误,即,当我定义LENGTH = 4 * 1024时,存在seg错误。 当我定义4 * 1024 * 1024时,没有seg错误。 这是什么原因? 代码如下: #define _POSIX_C_SOURCE 199309 #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #define PROTECTION (PROT_READ | PROT_WRITE) #define LENGTH (4*1024) //#define LENGTH (4*1024*1024) #define LINE_SIZE 64 #define ASSOC 16 #define CACHE_SIZE (4*1024*1024) #define WAY_SIZE (CACHE_SIZE/ASSOC) #ifndef MAP_HUGETLB #define MAP_HUGETLB 0x40000 #endif […]

打印一系列字符时遇到问题?

由于我不太了解我遇到的整体问题,因此调试变得非常困难。 char *o_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char)); for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){ o_key_pad[i] = 'a'; } printf("%s\n", o_key_pad); char *i_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char)); for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){ i_key_pad[i] = 'b'; } printf("%s\n", o_key_pad); printf("%s\n", i_key_pad); 我获得了输出: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 为什么数组’o_key_pad’扩展到包含我放在数组’i_key_pad’中的任何内容,看起来像某种内存问题? 注意:我知道它可以更有效地完成,但为了更清楚地表明我的观点,我已经这样做了。

C realloc不改变字符数组的表观大小

当我运行下面的代码时,我得到了给定的输出。 #include /* printf */ #include /* malloc, realloc */ int main() { char* characters = (char *) malloc(10 * sizeof(char)); printf(“Before: characters at %p, size=%lu\n”, (void *) characters, sizeof(characters) / sizeof(characters[0])); char* temp = (char *) realloc(characters, 100); if (temp) { printf(“After realloc, characters size = %lu, temp size = %lu\n”, sizeof(characters) / sizeof(characters[0]), […]

使用realloc时获取(核心转储)

void replace(char *str) { unsigned int len = 0; unsigned int no_of_spaces = 0; while (*str) { if ((char)*str == SPACE) no_of_spaces++; str++; len++; } unsigned int new_len = len + 2 * no_of_spaces; str = (char*) realloc(str, new_len * sizeof(char)); str[new_len] = ‘\0’; } 我使用像replace(“random string”);这样的函数replace(“random string”); 。 在这里,我试图增加字符串的大小,以便可以用另一个字符串替换空格。 为此,我需要计算空格的数量,并获得原始字符串的长度。 我能够做到这一点。 为了resize我使用realloc但是当我运行它时,它会Aborted (core dumped) […]

OpenCL缓冲区分配和映射最佳实践

关于使用OpenCL映射缓冲区的代码是否正确,我有点困惑。 我有两个例子,一个使用CL_MEM_USE_HOST_PTR,一个使用CL_MEM_ALLOC_HOST_PTR。 在本地计算机和OpenCL设备上都可以工作和运行,但我感兴趣的是这是否是正确的映射方式,以及它是否应该适用于所有OpenCL设备。 我对USE_HOST_PTR示例特别不确定。 我只对缓冲区/地图特定操作感兴趣。 我知道我应该做错误检查等等。 CL_MEM_ALLOC_HOST_PTR: // pointer to hold the result int * host_ptr = malloc(size * sizeof(int)); d_mem = clCreateBuffer(context,CL_MEM_READ_WRITE|CL_MEM_ALLOC_HOST_PTR, size*sizeof(cl_int), NULL, &ret); int * map_ptr = clEnqueueMapBuffer(command_queue,d_mem,CL_TRUE,CL_MAP_WRITE, 0,size*sizeof(int),0,NULL,NULL,&ret); // initialize data for (i=0; i<size;i++) { map_ptr[i] = i; } ret = clEnqueueUnmapMemObject(command_queue,d_mem,map_ptr,0,NULL,NULL); //Set OpenCL Kernel Parameters ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), […]

如何在64位机器上存储16字节数据类型

我一直看到我们可以使用扩展数据类型,如无符号long long,消耗16个字节的内存,即sizeof(无符号长long变量)在我的64位机器上产生16,我知道最大可能的数据类型受到限制系统的体系结构,即64位机器上的8字节,我只是想知道在CPU指令集只有64位长的机器上如何处理这种数据类型。 请帮忙。 谢谢