《并行程序设计 课后作业 第二章》

2.1

//program unroll
for (int i=0; i<n; i++){
    for (int j=0; j<n; j++){
        for (int k=0; k<n; k++){
            int A_data = ReadData(device_id=i*n^2+j*n+k, A_memory_address=i*n+k);
            int B_data = ReadData(device_id=i*n^2+j*n+k, B_memory_address=k*n+j);
            int C_data = A_data*B_data on device_id=i*n^2+j*n+k;
        }
    }
}

//program unroll
for (int i=0; i<n; i++){
    for (int j=0; j<n; j++){
        for (int logk_idx=2; logk_idx<logn; logk_idx*=2){
            //program unroll
            for (int krange_idx=0; krange_idx<n; krange_idx+=logk_idx){
                int add_buffer=C_data;
                for (int k=1; k<logk_idx; k++){
                    move C_data from device_id=krange_idx+k+i*n^2+j*n to device_id=krange_idx+i*n^2+j*n
                    and add to add_buffer
                }
            }
        }
    }
}


//program unroll
for (int i=0; i<n; i++){
    for (int j=0; j<n; j++){
        StoreData(device_id=i*n^2+j*n, C_data);
    }
}

第二问:可以对数据进行补零使之为2的指数

2.2

K1111222334555567
temp1000100101100011

在device上分配n个空间(temp),从左到右前缀求差,将temp=1的位置提取出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值