科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件简介 PLAYSTATION 3 上的 Linux(四)

简介 PLAYSTATION 3 上的 Linux(四)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如果没有 SPE,Cell BE 处理器的编程与其他基于 PowerPC 系统会十分类似。实际上,您可以假装 SPE 不存在,代码依然可以很好地工作。

作者:中国IT实验室 来源:中国IT实验室 2007年9月12日

关键字: 简介 系统 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;
}


 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章