https://github.com/stanford-cs149/asst1
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools-desktop
wget https://github.com/ispc/ispc/releases/download/v1.24.0/ispc-v1.24.0-linux.tar.gz
sudo apt-get install git
sudo apt-get install ispc
export PATH=$PATH:${
HOME}/(自己路径)/ispc-v1.24.0-linux/bin
gcc编译出错:fatal error: sys/cdefs.h: No such file or directory
sudo apt install gcc-multilib # 一般安装这个就可以了,不行再安装下面的
sudo apt install g++-multilib
sudo apt install libc6-dev libc6-dev-i386
任务1



线程数 耗时(单位:ms)
1 333
2 169
3 209
4 138
5 135
6 108
7 103
8 100
利用率不足的原因是不同线程负责的图像区域迭代的计算量不同,导致计算时间不同,出现了短板效应。3 线程中中间部分的计算时间明细大于上下两边,导致时间增加。


使用 16 线程时,性能提升通常不会显著高于 8 线程。
任务2
void _cs149_vload_float(__cs149_vec_float &dest, float* src, __cs149_mask &mask) {
_cs149_vload<float>(dest, src, mask); }
void _cs149_vload_int(__cs149_vec_int &dest, int* src, __cs149_mask &mask) {
_cs149_vload<int>(dest, src, mask); }
dest: 目标向量寄存器,存储从数组中加载的值。
src: 源数组,从中加载值。
mask: 掩码,控制哪些元素被加载。掩码中为1的位置表示对应的元素将被加载,为0的位置表示对应的元素保持原值
传统的标量操作是指每次处理一个数据点。例如,对于一个简单的数组加法操作:
for (int i = 0; i < N; i++) {
C[i] = A[i] + B[i];
}
在这个循环中,每次迭代只处理一个元素,总共需要N次迭代来完成整个数组的加法。
向量化操作
向量化操作通过使用SIMD指令,可以在一个时钟周期内同时处理多个数据点。例如,使用向量化指令可以将上述数组加法操作优化为:
for (int i = 0; i < N; i += VECTOR_WIDTH) {
__cs149_vec_float a, b, c;
_cs149_vload_float(a, A + i, mask);
_cs149_vload_float(b, B + i, mask);
_cs149_vadd_float(c, a, b, mask);
_cs149_vstore_float(C + i, c, mask);
}


任务3
在 ISPC(Intel® Implicit SPMD Program Compiler)的上下文中,task(任务) 是一个用于实现并行计算的高级抽象概念。它允许程序员将程序分解为多个独立的计算单元,这些计算单元可以并行执行,从而充分利用多核 CPU 的计算能力

线程抽象和 ISPC 任务

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



