更新:
现在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 exp在gdb可以检查是否值的变化,但有太多在这里,有一些方法来跟踪他们,我的意思是他们可能是近6000个.
谢谢你们.
我正在尝试实施MPI_Bcast,并且我计划通过MPI_Send但MPI_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)
对此有什么建议吗?或者我不应该向自己发送消息而只是进行内存复制?
我有一个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) 更新:我添加了一个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) 我在程序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中打开这个共享内存?有没有其他方法可以解决这个问题?因为我自动创建这个内存.
谢谢你们.
我按照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,我想有一种方法可以禁用它吗?谢谢你的任何投入.