view spe_programs/002_qsort/spe.c @ 0:42f240cc4bc6

From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Sep 2009 13:44:18 +0900
parents
children
line wrap: on
line source

/**
 * spe.c
 * SPE アプリケーション本体
 */

#include <spu_mfcio.h>

typedef struct
{
	unsigned long long ea;
	unsigned int count;
	unsigned int pad;
}
qsort_info;

typedef struct
{
	long long d;
	unsigned long long pad;
}
qsort_data;



volatile qsort_info info __attribute__((aligned(16)));

volatile qsort_data data[1024] __attribute__((aligned(16)));


unsigned long long main(unsigned long long arg)
{
	// qsort_info 読み込み
	mfc_get(&info, arg, sizeof(qsort_info), 0, 0, 0);
	spu_writech(MFC_WrTagMask, 1<<0);
	spu_mfcstat(MFC_TAG_UPDATE_ALL);

	// データ読み込み
	mfc_get(&data, info.ea, 16 * info.count, 0, 0, 0);
	spu_writech(MFC_WrTagMask, 1<<0);
	spu_mfcstat(MFC_TAG_UPDATE_ALL);

	if (info.count == 2)
	{
		if (data[0].d > data[1].d)
		{
			data[2] = data[0];
			data[0] = data[1];
			data[1] = data[2];

			// データ書き出し
			mfc_put(&data, info.ea, 32, 0, 0, 0);
			spu_writech(MFC_WrTagMask, 1<<0);
			spu_mfcstat(MFC_TAG_UPDATE_ALL);
		}
		return 0UL;   // これ以上ソートする必要なし
	}

	unsigned long long pivot = data[info.count / 2].d;
	unsigned int i = 0, j = info.count - 1;

	while (1)
	{
		while (data[i].d < pivot)
			i++;

		while (pivot < data[j].d)
			j--;

		if (i >= j) break;

		qsort_data swap = data[i];
		data[i] = data[j];
		data[j] = swap;

		i++;
		j--;
	}

	// データ書き出し
	mfc_put(&data, info.ea, 16 * info.count, 0, 0, 0);
	spu_writech(MFC_WrTagMask, 1<<0);
	spu_mfcstat(MFC_TAG_UPDATE_ALL);

	return (unsigned long long)i;
}