gpt4 book ai didi

matrix - 并行更改二维向量

转载 作者:行者123 更新时间:2023-12-03 11:44:38 26 4
gpt4 key购买 nike

我正在尝试使用crossbeam_utils版本0.8.0在二维矢量(图形)的每个位置设置值1。每个线程接收的子矩阵是不相交的。我在Windows上使用cargo run运行代码。我的代码基于这些question1question2。但是,出现以下错误:

thread '<unnamed>' panicked at 'index out of bounds: the len is 3 but the index is 3'
但是,如果我在产生的线程中注释命令 (*slice)[row][col] = 1,则可以看到线程在控制台中打印时工作正常。
是什么导致此错误?
use crossbeam_utils::thread;
use std::slice;

const NTHREADS: usize = 2;

fn build_graph() -> Vec<Vec<usize>> {

let dictionary: Vec<String> = vec!["monk".to_string(), "mock".to_string(), "pock".to_string(),
"pork".to_string(), "perk".to_string(), "perl".to_string()];
let s_graph = dictionary.len();
let mut graph: Vec<Vec<usize>> = vec![vec![0; s_graph]; s_graph];

let chunk = f32::ceil(s_graph as f32 / NTHREADS as f32) as usize;
let mut sliced_graph: Vec<&mut [Vec<usize>]> = Vec::with_capacity(NTHREADS);
let ptr_graph = graph.as_mut_ptr();

let mut offset;
let mut count_of_items;

// Creating mutable references for slices of the matrix
for n_th in 0..NTHREADS {
offset = n_th * chunk;
count_of_items = if offset + chunk > s_graph { s_graph - offset } else { chunk };
unsafe {
sliced_graph.push(slice::from_raw_parts_mut(ptr_graph.offset((offset) as isize), count_of_items));
}
}

thread::scope(|scope| {

let mut n_th: usize = 0;
let mut min_bound;
let mut max_bound;

for slice in &mut sliced_graph {

min_bound = n_th * chunk;
max_bound = if min_bound + chunk > s_graph { s_graph } else { min_bound + chunk};

scope.spawn(move |_| {

println!("thread number: {} - ini: {} - end: {}", n_th, min_bound, max_bound);

for row in min_bound..max_bound {

for col in 0..s_graph {

println!("th:{} -->> set row:{} col:{}", n_th, row, col);
(*slice)[row][col] = 1;
}
}

println!("thread number: {} - Finished!", n_th);
});

n_th += 1;
}
}).unwrap();

graph
}

fn main() {
build_graph();
}

最佳答案

@Masklinn提出的解决方案:

use crossbeam_utils::thread;
use std::slice;

const NTHREADS: usize = 2;

fn build_graph() -> Vec<Vec<usize>> {

let dictionary: Vec<String> = vec!["monk".to_string(), "mock".to_string(), "pock".to_string(),
"pork".to_string(), "perk".to_string(), "perl".to_string()];
let s_graph = dictionary.len();
let mut graph: Vec<Vec<usize>> = vec![vec![0; s_graph]; s_graph];

let chunk = f32::ceil(s_graph as f32 / NTHREADS as f32) as usize;
let mut sliced_graph: Vec<&mut [Vec<usize>]> = Vec::with_capacity(NTHREADS);
let ptr_graph = graph.as_mut_ptr();

// Creating mutable references for slices of the matrix
for n_th in 0..NTHREADS {
let offset = n_th * chunk;
let count_of_items = if offset + chunk > s_graph { s_graph - offset } else { chunk };
unsafe {
sliced_graph.push(slice::from_raw_parts_mut(ptr_graph.offset((offset) as isize), count_of_items));
}
}

thread::scope(|scope| {
for (n_th, slice) in sliced_graph.iter_mut().enumerate() {
scope.spawn(move |_| {
println!("thread number: {} - {:?}", n_th, slice);
for (row, r) in slice.into_iter().enumerate() {
for (col, cell) in r.into_iter().enumerate() {
println!("th:{} -->> set row:{} col:{}", n_th, row, col);
*cell = 1;
}
}

println!("thread number: {} - Finished!", n_th);
});
}
}).unwrap();
graph
}

fn main() {
build_graph();
}

关于matrix - 并行更改二维向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64388649/

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