频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

简介 PLAYSTATION 3 上的 Linux

来源:IBM DW 中国 作者: 出处:巧巧读书 2007-02-13 进入讨论组
上一页 1 2 3 4 5 下一页 
谢 谢 收 藏 http://www.qqread.com/linux/2007/02/g297992.html

   如果没有 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集群技术体验Linux的音影世界Linux驱动大全专题,或进入讨论组讨论。
上一页 1 2 3 4 5 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章