谢 谢 收 藏 http://www.qqread.com/linux/2007/02/g297992.html
正如前面介绍的一样,Cell BE 处理器中的 PPE 的主要任务是处理输入和输出任务。真正有趣的部分是 spe_create_thread。第一个参数是一个线程组 ID(0 表示应该为这个线程创建一个新组),第二个参数是 SPE 程序的句柄,第三个参数是指向要传输的数据的指针,第四个参数是一个可选的环境指针,第五个参数是运行程序希望使用的 SPE 的掩码(-1 表示可以使用任何可用的 SPE),最后一个参数是希望采用的选项的列表(在本例中,未使用任何选项)。这个函数返回 SPE 任务的 ID 号,然后您可以将它作为 spe_wait 的参数使用。spe_wait 在 SPE 任务结束时返回。
更多内容请看Linux集群技术、体验Linux的音影世界、Linux驱动大全专题,或进入讨论组讨论。
如果没有 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;
}
|
正如前面介绍的一样,Cell BE 处理器中的 PPE 的主要任务是处理输入和输出任务。真正有趣的部分是 spe_create_thread。第一个参数是一个线程组 ID(0 表示应该为这个线程创建一个新组),第二个参数是 SPE 程序的句柄,第三个参数是指向要传输的数据的指针,第四个参数是一个可选的环境指针,第五个参数是运行程序希望使用的 SPE 的掩码(-1 表示可以使用任何可用的 SPE),最后一个参数是希望采用的选项的列表(在本例中,未使用任何选项)。这个函数返回 SPE 任务的 ID 号,然后您可以将它作为 spe_wait 的参数使用。spe_wait 在 SPE 任务结束时返回。
下面是 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;
}
|
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Linux集群技术 (8384篇文章)
- 体验Linux的音影世界 (8056篇文章)
- Linux驱动大全 (8856篇文章)
- Linux下的路由的配置与应用 (11856篇文章)
- Linux命令简介 (9916篇文章)
- Linux防火墙 (9736篇文章)
- Linux日志专题 (8510篇文章)
- Linux服务器的安全性能 (20494篇文章)
- 揭秘Linux内存管理 (8120篇文章)
- 解析Linux文件系统 (8322篇文章)
- 安装qmail全套功略 (18次浏览)
- TurboLinux 入门教程:第七课 TurboLinux简介 (18次浏览)
- Linux系统管理员秘技:用快捷命令一招制胜 (18次浏览)
- Linux系统命令分类详解 (1) (18次浏览)
- Linux下使用aMsn详解 (18次浏览)
- 你会在Linux下用POP3收Web电子邮箱吗? (18次浏览)
- 在Linux中用三款工具轻松制作网页 (18次浏览)
- Linux上的偷窺裝置 (1394的使用) (18次浏览)
- 深入浅出分析Linux内核漏洞的问题 (18次浏览)
- Linux内核调试工具:Kdb应用指南(4) (18次浏览)



