小编Ham*_*alc的帖子

Matlab使用分布式阵列减慢并行处理速度

我是matlab中使用分布式和分布式数组的新手.我生产的并行代码有效,但比串行版慢得多,我不明白为什么.下面的代码示例从体积数据计算粗糙矩阵的特征值.

串口版:

S = size(D);
Dsmt=imgaussian(D,2,20);
[fx, fy, fz] = gradient(Dsmt);
DHess = zeros([3 3 S(1) S(2) S(3)]);
[DHess(1,1,:,:,:), DHess(1,2,:,:,:), DHess(1,3,:,:,:)] = gradient(fx);
[DHess(2,1,:,:,:), DHess(2,2,:,:,:), DHess(2,3,:,:,:)] = gradient(fy);
[DHess(3,1,:,:,:), DHess(3,2,:,:,:), DHess(3,3,:,:,:)] = gradient(fz);

d = zeros([3 S(1) S(2) S(3)]);
for i = 1 : S(1)
    fprintf('Slice %d out of %d\n', i, S(1));
    for ii = 1 : S(2)
        for iii = 1 : S(3)
            d(:,i,ii,iii) = eig(squeeze(DHess(:,:,i,ii,iii)));
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

并行版本:

S = size(D);
Dsmt=imgaussian(D,2,20);
[fx, fy, fz] = gradient(Dsmt); …
Run Code Online (Sandbox Code Playgroud)

parallel-processing matlab distributed distributed-computing

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

在C++中使用gcc浮点指针转换导致SIGBUS错误

我有一个动态定义的无符号8位整数数组:

const uint8_t *data;
Run Code Online (Sandbox Code Playgroud)

它包含一个字节流,并被重新解释为各种数据类型.我可以通过以下方式将此数据流中的位置n重新解释为基本类型类型:

type value =  *((type*) &data[n]);
Run Code Online (Sandbox Code Playgroud)

这适用于在Windows下使用Visual Studio编译器的所有数据类型,但是在Linux下使用gcc进行编译时,如果type为float(取消引用的位置在数据数组的范围内),则会创建SIGBUS错误.进一步的调查表明,引用此错误的是指针解除引用.我已经通过使用memcpy解决了这个问题,但是想知道为什么这会导致问题,因为引用的地址是有效的.reinterpret_cast会更合适,如果是,为什么?

编辑:

我没有提到Linux系统有ARM架构.@MSalters在下面指出,差异配置可能有更严格的指针对齐要求.一项简短的研究表明,虽然上述内容在x86架构上有效(尽管C/C++标准不允许),但ARM上的未对齐指针解除引用会导致总线错误.

c++ gcc pointers casting segmentation-fault

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