扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
如果没有 SPE,Cell BE 处理器的编程与其他基于 PowerPC 系统会十分类似。实际上,您可以假装 SPE 不存在,代码依然可以很好地工作。不过,这样就会导致有很多计算能力没有被充分利用。要充分利用 SPE 的优点,您只能多费点精力。
如果您是新接触 Cell BE 技术,请记住 PPE 是系统的资源管理器。它负责处理操作系统任务、管理对内存的访问并控制 SPE 的工作。PPE 的代码会负责对程序进行初始化、给一个或多个 SPE 设置任务并执行输入输出操作。当然,PPE 也可以执行处理任务,不过通常都是将任务合理地分配给 SPE 执行。
因此,让我们来了解一下简单程序是如何构造来在 SPE 上执行处理任务的。这个程序非常基本 ―― 它计算在给定速度(单位为每小时英里数)和时间(单位为小时)情况下的旅行距离。下面是 PPE 的代码(请将其输入到 ppe_distance.c 中):
清单 1. 方程求解的 PPE 代码
#include <stdio.h> #include <libspe.h> //This global is for the SPE program code itself. It will be created by //the embedspu program. extern spe_program_handle_t calculate_distance_handle; //This struct is used for input/output with the SPE task typedef struct { float speed; //input parameter float num_hours; //input parameter float distance; //output parameter float padding; //pad the struct a multiple of 16 bytes } program_data; int main() { program_data pd __attribute__((aligned(16))); //aligned for transfer //GATHER DATA TO SEND TO SPE printf("Enter the speed at which your car is travelling in miles/hr: "); scanf("%f", &pd.speed); printf("Enter the number of hours you have been driving at that speed: "); scanf("%f", &pd.num_hours); //USE THE SPE TO PROCESS THE DATA //Create SPE Task speid_t spe_id = spe_create_thread(0, &calculate_distance_handle, &pd, NULL, -1, 0); //Check For Errors if(spe_id == 0) { fprintf(stderr, "Error creating SPE thread!\n"); return 1; } //Wait For Completion spe_wait(spe_id, NULL, 0); //FORMAT THE RESULTS FOR DISPLAY printf("The distance travelled is %f miles.\n", pd.distance); return 0; } |
下面是 SPE 的代码(请将其输入到 spe_distance.c 中):
清单 2. SPE 计算的例子
//Pull in DMA commands #include <spu_mfcio.h> //Struct for communication with the PPE typedef struct { float speed; //input parameter float num_hours; //input parameter float distance; //output parameter float padding; //pad the struct a multiple of 16 bytes } program_data; int main(unsigned long long spe_id, unsigned long long program_data_ea, unsigned long long env) { program_data pd __attribute__((aligned(16))); int tag_id = 0; //READ DATA IN //Initiate copy mfc_get(&pd, program_data_ea, sizeof(pd), tag_id, 0, 0); //Wait for completion mfc_write_tag_mask(1<<tag_id); mfc_read_tag_status_any(); //PROCESS DATA pd.distance = pd.speed * pd.num_hours; //WRITE RESULTS OUT //Initiate copy mfc_put(&pd, program_data_ea, sizeof(program_data), tag_id, 0, 0); //Wait for completion mfc_write_tag_mask(1<<tag_id); mfc_read_tag_status_any(); return 0; } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者