小编bxs*_*shi的帖子

gdb看了大量的内存来查找损坏,这里没有seg故障

更新: 现在valgrind --tools=memcheck --track-origins=yes --leak-check=full ./prog运行正常,但没有这个valgrind,它仍然会出错,怎么会发生?

我在Linux上做了一个项目,它在内存中存储了大量数据,我需要知道哪个数据块被更改才能找到我程序中的问题.

更新:这是一个多线程程序,写入/读取由系统调用创建的不同线程完成.

代码是这样的

for(j=0;j<save_size;j++){
    e->blkmap_mem[blk_offset+save_offset + j] = get_mfs_hash_block();
    memcpy(e->blkmap_mem[blk_offset + save_offset +j]->data, (char *)buff + j * 4096, 4096);
    e->blkmap_mem[save_offset+j]->data = (char *)(buff + j* 4096);
    e->blkmap_mem[blk_offset+save_offset + j]->size = 4096;
    e->blkmap_addr[blk_offset+save_offset + j] = 1;
Run Code Online (Sandbox Code Playgroud)

我想知道是否e->blkmap_mem[blk_offset+save_offset+j]->data在其他地方改变了.

我知道awatch expgdb可以检查是否值的变化,但有太多在这里,有一些方法来跟踪他们,我的意思是他们可能是近6000个.

谢谢你们.

c linux memory gdb

3
推荐指数
1
解决办法
3154
查看次数

MPI无法通过MPI_Send和MPI_Recv向自己发送数据

我正在尝试实施MPI_Bcast,并且我计划通过MPI_SendMPI_Recv似乎我无法向自己发送消息?

代码如下

void My_MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) {
     int comm_rank, comm_size, i;
     MPI_Comm_rank(comm, &comm_rank);
     MPI_Comm_size(comm, &comm_size);
     if(comm_rank==root){
         for(i = 0; i < comm_size; i++){
                 MPI_Send(buffer, count, datatype, i, 0, comm);
         }
     }
     MPI_Recv(buffer, count, datatype, root, 0, comm, MPI_STATUS_IGNORE);
  }
Run Code Online (Sandbox Code Playgroud)

对此有什么建议吗?或者我不应该向自己发送消息而只是进行内存复制?

mpi openmpi

2
推荐指数
1
解决办法
8939
查看次数

Spark排序RDD并加入他们的排名

我有一个RDD[(VertexId, Double)],我希望对它进行排序,_._2并使用此RDD加入索引(排名).因此,我可以获得一个元素及其排名filter.

目前我对RDD进行排序sortBy,但我不知道如何加入RDD及其排名.所以我把它作为一个序列收集并用它的索引压缩它.但这并不高效.我想知道是否有更优雅的方式来做到这一点.

我现在使用的代码是:

val tmpRes = graph.vertices.sortBy(_._2, ascending = false) // Sort all nodes by its PR score in descending order
      .collect() // collect to master, this may be very expensive

    tmpRes.zip(tmpRes.indices) // zip with index
Run Code Online (Sandbox Code Playgroud)

scala apache-spark rdd

2
推荐指数
1
解决办法
2806
查看次数

我通过套接字发送一个C结构,但无法正确,总是错过一些字节

更新:我添加了一个while来获取剩余数据,问题解决了.谢谢你们.

while(res != rcvread->size + 4) {/* do not get full data */
    tmp = recv(connfd, (void *)rcvread + res, rcvread->size + 4 - res, 0);
    if(tmp == -1)
        printf("error:%s\n",(char *)strerror(errno));
    res+=tmp;
}
Run Code Online (Sandbox Code Playgroud)

我想mfsio通过套接字发送一个结构,返回值write是37772,但是当我从其他程序得到它时,返回值read是32768,这真的很奇怪.

这个结构的定义在这里

struct mfsio{
    size_t size;
    char buf[];
};
Run Code Online (Sandbox Code Playgroud)

发送代码在这里

struct mfsio *sndread;
sndread = malloc(sizeof(struct mfsio) + rcvcmd->size);
res = pread(fd, &(sndread->buf), rcvcmd->size, rcvcmd->offset);
sndread->size = res;
res = write(connfd, sndread, sizeof(struct mfsio) + res);
Run Code Online (Sandbox Code Playgroud)

接收代码在这里

struct mfsio …
Run Code Online (Sandbox Code Playgroud)

c sockets linux

1
推荐指数
1
解决办法
1295
查看次数

linux动态共享内存在不同的程序中

我在程序A中使用以下代码创建共享内存:

shm = shm_open("/mfs_hash_pool_container", O_CREAT|O_RDWR, 0666);

size = sizeof(struct mfs_hash_pool_container);

ftruncate(shm, size);

mfs_hash_pool_stat_p = (struct mfs_hash_pool_container *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm, 0);
Run Code Online (Sandbox Code Playgroud)

我用它来存储哈希表.

另一个程序B将从程序A接收addr(mfs_hash_pool_stat_p + offset)发送,但是我不能用B写它.这是否意味着我还必须在B中打开这个共享内存?有没有其他方法可以解决这个问题?因为我自动创建这个内存.

谢谢你们.

c linux shared-memory

1
推荐指数
1
解决办法
9151
查看次数

编译TensorFlow时禁用SSE4.1

我按照TF网站上的说明从源代码安装了TensorFlow.我没有更改任何配置,都是默认值.

当我运行我的程序(使用预先编译的TensorFlow 0.12轮时工作正常),它给我以下错误

F tensorflow/core/platform/cpu_feature_guard.cc:86] The TensorFlow library was compiled to use SSE4.1 instructions, but these aren't available on your machine.

默认情况下TensorFlow支持SSE4,我想有一种方法可以禁用它吗?谢谢你的任何投入.

tensorflow

1
推荐指数
1
解决办法
2368
查看次数

标签 统计

c ×3

linux ×3

apache-spark ×1

gdb ×1

memory ×1

mpi ×1

openmpi ×1

rdd ×1

scala ×1

shared-memory ×1

sockets ×1

tensorflow ×1