Mercurial > hg > Game > Atoc
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; }