Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bf5b8d60aa | ||
|
|
8d6c1cd0ea | ||
|
|
efe921aff5 | ||
|
|
de3a853228 | ||
|
|
77e20ad55c | ||
|
|
ffa5c8bf64 | ||
|
|
ba47ccb680 | ||
|
|
e97b1bee52 | ||
|
|
24f43183fd | ||
|
|
0628cf9249 | ||
|
|
da879a098f | ||
|
|
eb010ec7f5 | ||
|
|
70fd411418 | ||
|
|
e2f1251c70 | ||
|
|
06ad11340d | ||
|
|
5c34457f2d | ||
|
|
7cdcba4a35 | ||
|
|
b30be14b3e | ||
|
|
3b8d510aeb | ||
|
|
9132c437fc | ||
|
|
7159bbb1fd | ||
|
|
ae9643f2ce | ||
|
|
6559e62276 | ||
|
|
1552fb8ec8 | ||
|
|
79d0b184b8 | ||
|
|
2793349268 | ||
|
|
4a7845dc7a | ||
|
|
978bbe4b40 | ||
|
|
0bd2b92237 | ||
|
|
be51d4c842 | ||
|
|
af2ac4b113 | ||
|
|
6dd7949030 | ||
|
|
a27f8221cd | ||
|
|
8cff776c5e | ||
|
|
bae9e8a0d8 | ||
|
|
bbfad5b9df | ||
|
|
fd24693c6b | ||
|
|
cc9d3595bd | ||
|
|
1b397d8976 | ||
|
|
8c06ad76b6 | ||
|
|
50b735d3a5 | ||
|
|
5660fcf7c5 | ||
|
|
e979c07600 | ||
|
|
cd7d1f9450 | ||
|
|
cdaceef840 | ||
|
|
6ce606977b | ||
|
|
fb72e811d0 | ||
|
|
82197ac0d0 | ||
|
|
959cf0e8d4 | ||
|
|
bcbdc2fe38 | ||
|
|
ca2c7731d4 | ||
|
|
aeb8913a58 | ||
|
|
323a53d808 | ||
|
|
54931fc0e7 | ||
|
|
3024186aa6 | ||
|
|
ceed4ebd83 | ||
|
|
471246df18 | ||
|
|
ea33a24d01 | ||
|
|
d653516eba | ||
|
|
fc5e583715 | ||
|
|
70cd559457 | ||
|
|
49792e42a3 | ||
|
|
5626adc372 | ||
|
|
8a8585d2de | ||
|
|
e465196701 |
86
README.md
86
README.md
@@ -1,73 +1,55 @@
|
||||
# MultiPar
|
||||
|
||||
### v1.3.2.8 is public
|
||||
This is a minor update version to fix some bugs in rare cases.
|
||||
Most users don't see difference.
|
||||
If there is no serious problem in this version,
|
||||
next version will be the last of v1.3.2 tree.
|
||||
### v1.3.3.3 is public
|
||||
|
||||
I fixed a [problem of MultiPar shell extension](https://github.com/Yutaka-Sawada/MultiPar/issues/86),
|
||||
when UAC (User Account Control on Windows Vista or later) is disabled.
|
||||
Thanks whulkhulk and Slava46 for test and confirm.
|
||||
If other users could not "Integrate MultiPar into Shell" ago, he may try this new version.
|
||||
I fixed a few rare bugs in this version.
|
||||
While most users were not affected by those problems,
|
||||
those who saw the matter would better use new version.
|
||||
If there is a problem still, I will fix as possible as I can.
|
||||
I updated some help documents about Batch script.
|
||||
I mentioned the location of help files in ReadMe text.
|
||||
|
||||
I added a confirm dialog at closing MultiPar, when it's creating or repairing.
|
||||
This change may reduce accidental loss of working data.
|
||||
Though MultiPar inherits most usage and behavior of QuickPar, I would improve a bit.
|
||||
New version supports a PC with max 8 OpenCL devices.
|
||||
Thanks [Yi Gu for reporting bug in a rare environment](https://github.com/Yutaka-Sawada/MultiPar/issues/110).
|
||||
I didn't think a user put so many OpenCL devices on a PC.
|
||||
It will detect a Graphics board correctly.
|
||||
|
||||
I fixed [small bugs in my OpenCL code for GPU](https://github.com/Yutaka-Sawada/MultiPar/issues/88).
|
||||
Though I'm not sure the incident, it might not work rarely.
|
||||
Because I don't use a graphics board on my PC, I didn't test myself.
|
||||
Thanks apprehensivemom for test.
|
||||
Even when you checked "Enable GPU acceleration", it may not use GPU for small data.
|
||||
It's because starting GPU is slow.
|
||||
If calculation finishes in a few seconds, using CPU only may be faster.
|
||||
GPU may require at least a few minutes task to see speed difference.
|
||||
As a note, I write its threshold below.
|
||||
I improved source file splitting feature at creating PAR2 files.
|
||||
Thanks [AreteOne for reporting bug and suggestion of improvment](https://github.com/Yutaka-Sawada/MultiPar/issues/117).
|
||||
When file extension is a number, it didn't handle properly.
|
||||
If someone saw strange behavior at file splitting ago, it should have been solved in this version.
|
||||
|
||||
Threshold to use GPU:
|
||||
- Data size must be larger than 512 MB.
|
||||
- Block size must be larger than 64 KB.
|
||||
- Number of source blocks must be more than 256.
|
||||
- Number of recovery blocks must be more than 32.
|
||||
I fixed a bug in verifying external files.
|
||||
It might not find the last slice in a source file, when the file data is redundant.
|
||||
Thanks [dle-fr for reporting bug and testing many times](https://github.com/Yutaka-Sawada/MultiPar/issues/130).
|
||||
This solution may improve verification of damaged files, too.
|
||||
When source files are mostly random data like commpressed archive, there was no problem.
|
||||
|
||||
|
||||
[ Changes from 1.3.2.7 to 1.3.2.8 ]
|
||||
[ Changes from 1.3.3.2 to 1.3.3.3 ]
|
||||
|
||||
GUI update
|
||||
- Change
|
||||
- It won't erase Zone.Identifier flag of MultiPar.exe automatically.
|
||||
- It shows confirm dialog before close, when it's creating or repairing.
|
||||
|
||||
- Improvement
|
||||
- It will show error, when calling PAR client doesn't exist.
|
||||
|
||||
- Bug fix
|
||||
- When UAC is disabled, Shell Extesnion DLL uses HKEY_LOCAL_MACHINE.
|
||||
Installer update
|
||||
- Inno Setup was updated from v6.2.2 to v6.3.1.
|
||||
|
||||
PAR2 client update
|
||||
- Bug fix
|
||||
- It will show correct efficiency for over than TB size files.
|
||||
- GPU function works with MMX, when all SSE2, SSSE3, AVX2 are disabled.
|
||||
|
||||
All clients update
|
||||
- Change
|
||||
- It will search hidden files, when Windows Explorer shows them.
|
||||
- Fixed a bug in GPU acceleration, when there are many OpenCL devices.
|
||||
- Failure of splitting source files with numerical extension was fixed.
|
||||
- Faulty prediction of the last block in a file with repeated data was fixed.
|
||||
|
||||
|
||||
[ Hash value ]
|
||||
|
||||
MultiPar1328.zip
|
||||
MD5: C7BD23C0D32C47555E344D9D88C149C2
|
||||
SHA1: 467F85E53011B3BC1E67E6685B1787D32B6F2296
|
||||
MultiPar1333.zip
|
||||
MD5: 01A201CA340C33053E6D7D2604D54019
|
||||
SHA1: F7C30A7BDEB4152820C9CFF8D0E3DA719F69D7C6
|
||||
|
||||
MultiPar1328_setup.exe
|
||||
MD5: 4D7A3BA6B88D9F37A22C35C425DA5F4D
|
||||
SHA1: 6BCCF834BC6038F1AC30F82B193A2B5F45FD7697
|
||||
MultiPar1333_setup.exe
|
||||
MD5: 33F9E441F5C1B2C00040E9BAFA7CC1A9
|
||||
SHA1: 6CEBED8CECC9AAC5E8070CD5E8D1EDF7BBBC523A
|
||||
To install under "Program Files" or "Program Files (x86)" directory,
|
||||
you must start the installer with administrative privileges by selecting
|
||||
"Run as administrator" on right-click menu.
|
||||
you must select "Install for all users" at the first dialog.
|
||||
|
||||
Old versions and source code packages are available at
|
||||
[GitHub](https://github.com/Yutaka-Sawada/MultiPar/releases) or
|
||||
[OneDrive](https://1drv.ms/u/s!AtGhNMUyvbWOaSo1n_R8awJ_hg0).
|
||||
[OneDrive](https://1drv.ms/f/c/8eb5bd32c534a1d1/QtGhNMUyvbUggI5pAAAAAAAAKjWf9HxrAn-GDQ).
|
||||
|
||||
Binary file not shown.
@@ -25,7 +25,13 @@ Be careful to use those special features.
|
||||
|
||||
[ System requirement ]
|
||||
|
||||
MultiPar requires a PC with Windows Vista or later (Windows 7, 8, 10).
|
||||
MultiPar requires a PC with Windows Vista or later (Windows 7, 8, 10, 11).
|
||||
|
||||
[ Usage manual or Help documents ]
|
||||
|
||||
There are some usage manual or help documents in "help" folder.
|
||||
English pages exists in "help/0409" folder.
|
||||
You may open the manual by pushing "F1-key", while using MultiPar.
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
@@ -71,14 +77,13 @@ Don't send current PAR3 files to others, who may not have the same version.
|
||||
|
||||
[ How to install or uninstall with installer package ]
|
||||
|
||||
Double click setup file ( MultiPar131_setup.exe or something like this name ),
|
||||
Double click setup file ( MultiPar133_setup.exe or something like this name ),
|
||||
and follow the installer dialog.
|
||||
At version up, if you want to use previous setting, overwrite install is possible.
|
||||
Before overwrite install, you should un-check "Integrate MultiPar into Shell".
|
||||
You may need to re-start OS after overwrite install or uninstall rarely.
|
||||
To install under "Program Files" or "Program Files (x86)" directory,
|
||||
you must start the installer with administrative privileges by selecting
|
||||
"Run as administrator" on right-click menu.
|
||||
you must select "Install for all users" at the first dialog.
|
||||
|
||||
You can uninstall through the Windows OS's Control Panel,
|
||||
or double click unins000.exe in a folder which MultiPar was installed.
|
||||
@@ -100,7 +105,7 @@ In either case, user made icons and association are available for the user only.
|
||||
|
||||
[ How to install with archive version ]
|
||||
|
||||
Unpack compressed file ( MultiPar131.zip or something like this name ) in a folder.
|
||||
Unpack compressed file ( MultiPar133.zip or something like this name ) in a folder.
|
||||
MultiPar.exe is the interface of MultiPar.
|
||||
|
||||
You can create short-cut icon or send-to link at Option window later.
|
||||
|
||||
@@ -1,220 +1,228 @@
|
||||
|
||||
修復用データを作ってファイルの破損や消失に備える
|
||||
|
||||
<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>f<EFBFBD>[<5B>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ăt<C483>@<40>C<EFBFBD><43><EFBFBD>̔j<CC94><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɔ<EFBFBD><C994><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
MultiPar (<28>}<7D><><EFBFBD>`<60>p<EFBFBD>[)
|
||||
MultiPar (マルチパー)
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD>ȒP<EFBFBD>ȉ<EFBFBD><EFBFBD><EFBFBD> ]
|
||||
[ 簡単な解説 ]
|
||||
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>烊<EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>쐬<EFBFBD><EC90AC><EFBFBD>āA
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̈ꕔ<CC88><EA9594><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>A
|
||||
<EFBFBD>c<EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ƃ<EFBFBD><C683>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>ďC<C48F><43><EFBFBD>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ׂ̃\<5C>t<EFBFBD>g<EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>ʓI<EFBFBD>ȃt<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<5C>t<EFBFBD>g<EFBFBD>Ƃ͈قȂ<D982><C882>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>炩<EFBFBD><EFBFBD><EFBFBD>߃<EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƂŁA
|
||||
<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̔j<CC94><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɔ<EFBFBD><C994><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
複数のファイルからリカバリ・ファイルを作成して、
|
||||
それらのファイルの一部が破損したり消失しても、
|
||||
残されたファイルとリカバリ・ファイルを使って修復・復元する為のソフトです。
|
||||
一般的なファイル復旧ソフトとは異なり、
|
||||
あらかじめリカバリ・ファイルを作っておくことで、
|
||||
ファイルの破損や消失に備えるのが特徴です。
|
||||
|
||||
<EFBFBD>@CD <EFBFBD><EFBFBD> DVD <EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>ۂɁA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ރf<EFBFBD>[<5B>^<5E>̃<EFBFBD><CC83>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɏĂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>Ȃǂŕ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ɓǂ߂Ȃ<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>ĕ<EFBFBD><C495><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>C<EFBFBD>O<EFBFBD>ł́A<EFBFBD>l<EFBFBD>b<EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>[<5B>N<EFBFBD>o<EFBFBD>R<EFBFBD>ŕ<EFBFBD><C595><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۂɁA
|
||||
<EFBFBD>ꕔ<EFBFBD>̃t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>Ŏ<EFBFBD><C58E>s<EFBFBD><73><EFBFBD>Ă<EFBFBD><C482>đ<EFBFBD><C491>M<EFBFBD><4D><EFBFBD>邱<EFBFBD>ƂȂ<C682><C882>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Č<EFBFBD><C48C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>₤<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>p<EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ł<EFBFBD><C582>B
|
||||
CD や DVD を焼く際に、書き込むデータのリカバリ・ファイルを
|
||||
作って、それも同時に焼いておけば、傷などで部分的に読めなくなっても、
|
||||
リカバリ・ファイルを使って復元することができます。
|
||||
海外では、ネットワーク経由で複数ファイルを転送する際に、
|
||||
一部のファイルで失敗しても再送信することなく、
|
||||
リカバリ・ファイルを使って欠落部分を補うという用途が多いようです。
|
||||
|
||||
<EFBFBD>@Parchive <EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>`<60><><EFBFBD>ɂ͕W<CD95><57><EFBFBD>\<5C>t<EFBFBD>g<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>
|
||||
Peter Clements <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́u QuickPar <EFBFBD>v<EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AQuickPar <EFBFBD>͉<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɊJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>f<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>āA
|
||||
<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŁA<EFBFBD>Ȃ<EFBFBD><EFBFBD>ׂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>Ȏg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>œ<EFBFBD><EFBFBD>{<7B>ꂪ<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>ގ<EFBFBD><DE8E>\<5C>t<EFBFBD>g<EFBFBD>Ƃ<EFBFBD><C682>āA
|
||||
<EFBFBD>ނ̋<EFBFBD><EFBFBD>āA<EFBFBD><EFBFBD><EFBFBD>̃A<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
Parchive というリカバリ・ファイル形式には標準ソフトとして
|
||||
Peter Clements さんの「 QuickPar 」というのがあります。
|
||||
しかし、QuickPar は何年も前に開発が中断されていて、
|
||||
日本語のファイル名やフォルダを扱うことができません。
|
||||
そこで、なるべく同じような使い勝手で日本語が使える類似ソフトとして、
|
||||
彼の許可を得て、このアプリケーションを開発しました。
|
||||
|
||||
<EFBFBD>@QuickPar <EFBFBD>̓o<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>_<EFBFBD>̗v<EFBFBD>]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>f<EFBFBD><66><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>߁A
|
||||
PAR 2.0 <EFBFBD>Ńt<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD> MultiPar <20>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AQuickPar <20>ł͏C<CD8F><43><EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ́A
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>Ă݂Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
QuickPar はバグ報告や改善点の要望があっても反映されないため、
|
||||
PAR 2.0 でファイルを修復できる可能性は MultiPar の方が高いです。
|
||||
日本語のファイル名を使う時や、QuickPar では修復できなかった時には、
|
||||
ぜひ MultiPar を使ってみてください。
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>d<EFBFBD>l<EFBFBD>Ȃ<EFBFBD> ]
|
||||
[ 特徴や仕様など ]
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD><EFBFBD> PAR 1.0 <EFBFBD><EFBFBD> PAR 2.0 <EFBFBD>̗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɑΉ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă܂<EFBFBD><EFBFBD>B
|
||||
Parity Archive <EFBFBD><EFBFBD> Parity Volume Set <EFBFBD>d<EFBFBD>l<EFBFBD>̏ڍׂɂ<EFBFBD><EFBFBD>Ă<EFBFBD>
|
||||
<EFBFBD>u http://parchive.sourceforge.net/ <EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>Q<EFBFBD>Ƃ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
MultiPar <EFBFBD>̓<EFBFBD><EFBFBD>j<EFBFBD>R<EFBFBD>[<5B>h (UTF-8 <EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD> UTF-16) <EFBFBD>Ńt<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA
|
||||
<EFBFBD><EFBFBD><EFBFBD>{<7B>ꂾ<EFBFBD><EA82BE><EFBFBD>łȂ<C582><C882><EFBFBD><EFBFBD>̌<EFBFBD><CC8C><EFBFBD><EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƌ<EFBFBD><C68C><EFBFBD><EFBFBD>E<EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
MultiPar は PAR 1.0 と PAR 2.0 の両方に対応してます。
|
||||
Parity Archive と Parity Volume Set 仕様の詳細については
|
||||
「 http://parchive.sourceforge.net/ 」を参照してください。
|
||||
MultiPar はユニコード (UTF-8 または UTF-16) でファイル名を扱うので、
|
||||
日本語だけでなく他の言語のファイル名もきちんと検査・修復することができます。
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD><EFBFBD> PAR 2.0 <EFBFBD>ł̓t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>łȂ<C582><C882>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AQuickPar <EFBFBD>̓T<EFBFBD>u<EFBFBD>E<EFBFBD>f<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>𐳂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>̂ŁA
|
||||
MultiPar <EFBFBD>Ńf<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD>܂ރp<DE83><70><EFBFBD>e<EFBFBD>B<EFBFBD><42><EFBFBD>ɂ<EFBFBD><C982>쐬<EFBFBD><EC90AC><EFBFBD>Ă<EFBFBD><C482>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃɒ<EFBFBD><EFBFBD>ӂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
par2cmdline <EFBFBD><EFBFBD> MultiPar <EFBFBD>Ɠ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>ƃf<C683>B<EFBFBD><42><EFBFBD>N<EFBFBD>g<EFBFBD><67><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ő<CC82><C591><EFBFBD><EFBFBD>v<EFBFBD>ł<EFBFBD><C582>B
|
||||
MultiPar <EFBFBD>̓p<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>ɂɃR<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
QuickPar <EFBFBD>ȂǑ<EFBFBD><EFBFBD><EFBFBD> PAR <20>N<EFBFBD><4E><EFBFBD>C<EFBFBD>A<EFBFBD><41><EFBFBD>g<EFBFBD>̓R<CD83><52><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>@<40>\<5C>ɑΉ<C991><CE89><EFBFBD><EFBFBD>ĂȂ<C482><C882>悤<EFBFBD>ł<EFBFBD><C582>B
|
||||
MultiPar の PAR 2.0 ではファイルだけでなくフォルダを扱うこともできます。
|
||||
ただし、QuickPar はサブ・ディレクトリを正しく認識しないので、
|
||||
MultiPar でディレクトリ構造を含むパリティ書庫を作成しても、
|
||||
うまく検査できないことに注意してください。
|
||||
par2cmdline は MultiPar と同じくユニコードとディレクトリ構造を認識するので大丈夫です。
|
||||
MultiPar はパリティ書庫にコメントを付けることができますが、
|
||||
QuickPar など他の PAR クライアントはコメント機能に対応してないようです。
|
||||
|
||||
[ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]
|
||||
[ 動作環境 ]
|
||||
|
||||
<EFBFBD>@Windows Vista <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȍ~ (Windows 7, 8, 10) <20>̃p<CC83>\<5C>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ł<EFBFBD><C582>B
|
||||
Windows Vista かそれ以降 (Windows 7, 8, 10, 11) のパソコンが必要です。
|
||||
|
||||
[ 使い方や解説文章 ]
|
||||
|
||||
ほとんど英語ですが、help フォルダーの中に使い方や解説文章が入ってます。
|
||||
日本語のページは help\0411 フォルダーの中にあります。
|
||||
MultiPar の使用中に、F1-key を押すと、マニュアルが表示されます。
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD>s<EFBFBD><EFBFBD>⌇<EFBFBD>ׂȂ<EFBFBD> ]
|
||||
[ 不具合や欠陥など ]
|
||||
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>F<EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ɂ<EFBFBD><C982>Ă<EFBFBD><C482>̂ł<CC82><C582><EFBFBD><EFBFBD>A<EFBFBD>s<EFBFBD><EFBFBD><EF8D87><EFBFBD><EFBFBD><EFBFBD>邩<EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɖ<EFBFBD><EFBFBD>肪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́A<EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><EFBFBD>Ǐ<EFBFBD><EFBFBD>Ȃǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>炦<EFBFBD><EFBFBD><EFBFBD>ƁA
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>A<EFBFBD>b<EFBFBD>v<EFBFBD>ŏC<C58F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>w<EFBFBD>͂<EFBFBD><CD82>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40>\<5C><><EFBFBD>lj<EFBFBD><C789><EFBFBD><EFBFBD>ė~<7E><><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>A<EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><50><EFBFBD>ė~<7E><><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>]<5D><><EFBFBD>t<F382AF95><74><EFBFBD>܂<EFBFBD><DC82>B
|
||||
動作確認はそれなりにしてるのですが、不具合があるかもしれません。
|
||||
動作に問題があった場合は、その状況や症状などを報告してもらえると、
|
||||
今後のバージョン・アップで修正するよう努力します。
|
||||
新しい機能を追加して欲しいとか、どこを改善して欲しいといった要望も受け付けます。
|
||||
|
||||
<EFBFBD>@<40><><EFBFBD>Ȃ݂ɁA<C981><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>肵<EFBFBD>đ<EFBFBD><C491>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD>͂ł<CD82><C582>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>l<EFBFBD>ŊJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă邩<EFBFBD><EFBFBD><EFBFBD>ł͂Ȃ<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ̃}<7D>C<EFBFBD>N<EFBFBD><4E><EFBFBD>\<5C>t<EFBFBD>g<EFBFBD>̉<EFBFBD><CC89><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<5C>t<EFBFBD>g<EFBFBD>ł<EFBFBD>
|
||||
<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>̃\<5C>t<EFBFBD>g<EFBFBD><67><EFBFBD>g<EFBFBD><67><EFBFBD>ĉ<EFBFBD><C489><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>Ă<EFBFBD><C482>ӔC<D394>͎<EFBFBD><CD8E><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>v<EFBFBD>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>菑<EFBFBD><E88F91><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>@<40><><EFBFBD>I<EFBFBD>ȗ<EFBFBD><C897>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>ǂ<EFBFBD><C782><EFBFBD><EFBFBD>͂<EFBFBD><CD82>Ă<EFBFBD><C482><EFBFBD><EFBFBD>A<EFBFBD>p<EFBFBD>\<5C>R<EFBFBD><52><EFBFBD>E<EFBFBD>\<5C>t<EFBFBD>g<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>̂͂<CC82><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă鎞<C482>Ɏ<EFBFBD><C98E>ȐӔC<D394>ʼn<EFBFBD><C589><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD>Șb<C898>Ȃ̂ŁA
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>菜<EFBFBD><EFBFBD><EFBFBD>菕<EFBFBD><EFBFBD><EFBFBD>͂ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B
|
||||
ちなみに、誤った使い方をしたりして損害が発生したとしても損害賠償はできません。
|
||||
個人で開発してるからではなく、大手企業のマイクロソフトの何万円もするソフトでも
|
||||
「このソフトを使って何が起きても責任は取らない」みたいなことがしっかり書いてあります。
|
||||
法律的な裏付けがあるのかどうかはさておき、パソコン・ソフトというのはそういう物です。
|
||||
ただまあ、ユーザーが困ってる時に自己責任で解決しろというのも酷な話なので、
|
||||
私も問題点が何かとか障害を取り除く手助けはできる限りやります。
|
||||
|
||||
|
||||
[ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]
|
||||
[ 情報漏洩や改竄 ]
|
||||
|
||||
<EFBFBD>@Parity Archive (<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD>̂ɂ́A
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̘R<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD>Ӑ}<7D>I<EFBFBD>ȉ<EFBFBD>₂<EFBFBD><E28282>h<EFBFBD><68><EFBFBD>悤<EFBFBD>Ȏd<C88E>g<EFBFBD>݂͂<DD82><CD82><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
Parity <EFBFBD>Ƃ́u<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӗ<EFBFBD><EFBFBD>Ȃ̂ŁA
|
||||
<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>ɂɂ̓\<5C>[<5B>X<EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ƃ<CC82><C682>Ĉ<EFBFBD><C488><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>ނ̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>Í<EFBFBD><C38D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>A<EFBFBD>Í<EFBFBD><C38D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ń<EFBFBD><C583>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>쐬<EFBFBD><EC90AC><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>܂<EFBFBD><EFBFBD>A<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>̊m<EFBFBD><EFBFBD><EFBFBD>łȂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>ďC<C48F><43><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ́A
|
||||
<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD><EFBFBD><EFBFBD>肩<EFBFBD>łȂ<EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD>̂Ɠ<CC82><C693><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃł<C682><C582>B
|
||||
<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>玝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>E<EFBFBD>B<EFBFBD><42><EFBFBD>X<EFBFBD>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă邩<C482><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>A
|
||||
<EFBFBD>̂Ɠ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɁA<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>玝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ŏC<C58F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
|
||||
<EFBFBD>E<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>Ɋ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD><EFBFBD><EFBFBD>̂ɂȂ<EFBFBD><EFBFBD>Ă邩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>܂<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>₂<EFBFBD><EFBFBD>ꂽ<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>ăt<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>ƁA
|
||||
<EFBFBD>{<7B><><EFBFBD>Ӑ}<7D><><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ͏C<CD8F><43><EFBFBD><EFBFBD><EFBFBD>ꂸ<EFBFBD>A<EFBFBD><41>₂<EFBFBD><E28282>ꂽ<EFBFBD>f<EFBFBD>[<5B>^<5E>ɂȂ<C982><C882>܂<EFBFBD><DC82>B
|
||||
Parity Archive (パリティ書庫) 自体には、
|
||||
情報の漏洩や意図的な改竄を防ぐような仕組みはありません。
|
||||
Parity とは「同じ価値を持つ物」という意味なので、
|
||||
パリティ書庫にはソース・ファイルと同じ価値があるものとして扱ってください。
|
||||
機密書類のファイルを暗号化するなら、暗号化した後でリカバリ・ファイルを作成してください。
|
||||
また、出所の確かでないリカバリ・ファイルを使って修復することは、
|
||||
内容が定かでないファイルを置くのと同じことです。
|
||||
外部から持ち込んだ実行ファイルやドキュメントがウィルスに感染してるかもしれない、
|
||||
のと同じように、外部から持ち込んだリカバリ・ファイルで修復したファイルは
|
||||
ウィルスに感染させられたものになってるかもしれません。
|
||||
つまり、改竄されたパリティ書庫を使ってファイルを修復しようとすると、
|
||||
本来意図したようには修復されず、改竄されたデータになります。
|
||||
|
||||
|
||||
[ PAR 3.0 <EFBFBD>d<EFBFBD>l<EFBFBD>͒<EFBFBD><EFBFBD>ĔłŖ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]
|
||||
[ PAR 3.0 仕様は提案版で未完成 ]
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD>ł<EFBFBD> Parchive <EFBFBD>d<EFBFBD>l<EFBFBD>̎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>Ăł<C482><C582><EFBFBD> PAR 3.0 <EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>Ɏg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>APAR 3.0 <20>d<EFBFBD>l<EFBFBD>͂܂<CD82><DC82>ڍׂ<DA8D><D782><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̉<EFBFBD><CC89><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>K<EFBFBD>ŁA
|
||||
MultiPar <EFBFBD>͂<EFBFBD><EFBFBD>̎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD>ĐV<EFBFBD>d<EFBFBD>l<EFBFBD>̐<EFBFBD><EFBFBD>\<5C><><EFBFBD>̊<EFBFBD><CC8A>ł<EFBFBD><C582><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
PAR 3.0 <EFBFBD>d<EFBFBD>l<EFBFBD>̃t<EFBFBD>H<EFBFBD>[<5B>}<7D>b<EFBFBD>g<EFBFBD>͍ו<CD8D><D795><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ōŏI<C58F>łƂ̌݊<CC8C><DD8A><EFBFBD><EFBFBD>͕ۏ<DB8F><D882><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>܂<EFBFBD><EFBFBD>AMultiPar <EFBFBD>Ŏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><EFBFBD> PAR3 <20><><EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃o<CC83>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>Ƃ͌<C682><CD8C><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>ɁA<EFBFBD><EFBFBD><EFBFBD>̐l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482>Ƃ͌<C682><CD8C><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>̂ŁA
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><EFBFBD> PAR3 <20><><EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>͑<EFBFBD><CD91>l<EFBFBD>ɑ<EFBFBD><C991><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
MultiPar では Parchive 仕様の次期バージョン案である PAR 3.0 を
|
||||
実験的に使えるようになっています。
|
||||
しかし、PAR 3.0 仕様はまだ詳細を検討中の下書き段階で、
|
||||
MultiPar はその試作品を使って新仕様の性能を体感できるにすぎません。
|
||||
PAR 3.0 仕様のフォーマットは細部が流動的で最終版との互換性は保証されません。
|
||||
つまり、MultiPar で試作品の PAR3 リカバリ・ファイルを今作っても、
|
||||
そのリカバリ・ファイルを将来のバージョンでも使えるとは限りません。
|
||||
同様に、他の人が同じバージョンを使ってるとは限らないので、
|
||||
試作品の PAR3 リカバリ・ファイルは他人に送らないでください。
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>ł̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>ƃA<C683><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><> ]
|
||||
[ インストーラー版のインストールとアンインストール ]
|
||||
|
||||
<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[ ( MultiPar131_setup.exe <EFBFBD>݂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȗ<EFBFBD><EFBFBD>O ) <20><><EFBFBD>_<EFBFBD>u<EFBFBD><75><EFBFBD>E<EFBFBD>N<EFBFBD><4E><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>ƁA
|
||||
<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581><41><EFBFBD>̎w<CC8E><77><EFBFBD>ɏ]<5D><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>A<EFBFBD>b<EFBFBD>v<EFBFBD><76><EFBFBD>ɁA<C981>ݒ荀<DD92>ڂ<EFBFBD><DA82><EFBFBD><EFBFBD>̂܂g<DC8E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͏㏑<CD8F><E38F91><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD>㏑<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɁA<C981>uMultiPar <20><><EFBFBD>V<EFBFBD>F<EFBFBD><46><EFBFBD>ɓ<EFBFBD><C993><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>O<EFBFBD><4F><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>㏑<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OS <20>̍ċN<C48B><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82><EFBFBD><EFBFBD>邩<EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>uProgram Files<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>uProgram Files (x86)<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>ɃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ́A
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD>[<5B>́u<CC81>Ǘ<EFBFBD><C797>҂Ƃ<D282><C682>Ď<EFBFBD><C48E>s<EFBFBD>v<EFBFBD><76><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD>
|
||||
<EFBFBD>Ǘ<EFBFBD><EFBFBD>Ҍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B><><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
インストーラー ( MultiPar133_setup.exe みたいな名前 ) をダブル・クリックすると、
|
||||
インストール画面が表示されるので、その指示に従ってください。
|
||||
バージョン・アップ時に、設定項目をそのまま使いたい時は上書きインストールしてもいいです。
|
||||
上書きインストールする前に、「MultiPar をシェルに統合する」のチェックを外してください。
|
||||
上書きインストールやアンインストール後に OS の再起動を求められるかもしれません。
|
||||
「Program Files」や「Program Files (x86)」内にインストールするには、
|
||||
最初のダイアログで「すべてのユーザー用にインストール」を選んでください。
|
||||
|
||||
<EFBFBD>@<40>A<EFBFBD><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD> Windows OS <20>̃R<CC83><52><EFBFBD>g<EFBFBD><67><EFBFBD>[<5B><><EFBFBD>E<EFBFBD>p<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>A
|
||||
MultiPar <20><><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD> unins000.exe <20><><EFBFBD>_<EFBFBD>u<EFBFBD><75><EFBFBD>E<EFBFBD>N<EFBFBD><4E><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>͐ݒ<CD90><DD92>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ォ<EFBFBD><E382A9><EFBFBD>u<EFBFBD><75><EFBFBD>ꂽ<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD><ED8F9C><EFBFBD>Ȃ<EFBFBD><C882>̂ŁA
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ȃ玩<EFBFBD><EFBFBD><EFBFBD>ō폜<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
右クリック・メニューの「管理者として実行」を選んで
|
||||
管理者権限でインストーラーを開始する必要があります。
|
||||
|
||||
<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>ł<EFBFBD><C582>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́A<CD81>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><EFBFBD><F093AE82><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>ƁA<EFBFBD><EFBFBD><EFBFBD>ŃA<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>Ɏ<EFBFBD><C98E>s<EFBFBD><73><EFBFBD>邱<EFBFBD>ƂɂȂ<C982><C882>܂<EFBFBD><DC82>B
|
||||
アンインストールは Windows OS のコントロール・パネルから行うか、
|
||||
MultiPar をインストールしたフォルダ内の unins000.exe をダブル・クリックしてください。
|
||||
アンインストーラーは設定ファイルや後から置かれたファイルを削除しないので、
|
||||
もう使うことがないなら自分で削除してください。
|
||||
|
||||
[ <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>łɂ<C582><C982>镡<EFBFBD><E995A1><EFBFBD><EFBFBD><EFBFBD>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><> ]
|
||||
インストーラー版を使った場合は、インストールしたフォルダを動かさないでください。
|
||||
さもないと、後でアンインストールに失敗することになります。
|
||||
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>[<5B>U<EFBFBD>[<5B><><EFBFBD>p<EFBFBD>\<5C>R<EFBFBD><52><EFBFBD>Ƀ<EFBFBD><C983>O<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>A
|
||||
<EFBFBD>Ǘ<EFBFBD><EFBFBD>҂͑S<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <20><><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>Ǘ<EFBFBD><EFBFBD>Ҍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<CE81>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>^<5E>[<5B>g<EFBFBD>E<EFBFBD><45><EFBFBD>j<EFBFBD><6A><EFBFBD>[<5B>̃A<CC83>C<EFBFBD>R<EFBFBD><52><EFBFBD>A
|
||||
<EFBFBD>f<EFBFBD>X<EFBFBD>N<EFBFBD>g<EFBFBD>b<EFBFBD>v<EFBFBD>̃A<EFBFBD>C<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ăt<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̊֘A<D698>t<EFBFBD><74><EFBFBD>͑S<CD91>Ẵ<C482><CC83>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>uProgram Files<65>v<EFBFBD><76><EFBFBD>ɃC<C983><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>A<EFBFBD><41><EFBFBD>ꂼ<EFBFBD><EA82BC><EFBFBD>̃<EFBFBD><CC83>[<5B>U<EFBFBD>[<5B><><EFBFBD>ʂɐݒ<C990><DD92><EFBFBD><EFBFBD>ێ<EFBFBD><DB8E><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>̑<EFBFBD><EFBFBD>̃t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>ɃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>A<EFBFBD>S<EFBFBD>Ẵ<C482><CC83>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD><DD92><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD>܂<EFBFBD><DC82>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̏ꍇ<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>C<EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>֘A<D698>t<EFBFBD><74><EFBFBD>͂<EFBFBD><CD82>̃<EFBFBD><CC83>[<5B>U<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
[ インストーラー版による複数ユーザー向けのインストール ]
|
||||
|
||||
複数のユーザーがパソコンにログオンするなら、
|
||||
管理者は全員向けに MultiPar をインストールすることができます。
|
||||
管理者権限でインストールすれば、インストーラーが作ったスタート・メニューのアイコン、
|
||||
デスクトップのアイコン、そしてファイルの関連付けは全てのユーザーが利用できます。
|
||||
「Program Files」内にインストールした場合、それぞれのユーザーが個別に設定を保持します。
|
||||
その他のフォルダにインストールした場合、全てのユーザーが同じ設定を共有します。
|
||||
いずれの場合も、ユーザーが作ったアイコンや関連付けはそのユーザーだけが利用できます。
|
||||
|
||||
|
||||
[ <EFBFBD>A<EFBFBD>[<5B>J<EFBFBD>C<EFBFBD>u<EFBFBD>ł̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><> ]
|
||||
[ アーカイブ版のインストール ]
|
||||
|
||||
<EFBFBD>@<40>z<EFBFBD>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD>Ă鈳<C482>k<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43> ( MultiPar131.zip <EFBFBD>݂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȗ<EFBFBD><EFBFBD>O ) <20><><EFBFBD>𓀂<EFBFBD><F0938082>Ăł<C482><C582><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
|
||||
<EFBFBD>ǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD><EFBFBD><EFBFBD>ȃt<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>ɑS<EFBFBD>ē<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>̒<EFBFBD><EFBFBD><EFBFBD> MultiPar.exe <EFBFBD>Ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD> MultiPar <EFBFBD>̎<EFBFBD><EFBFBD>s<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <20><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
配布されてる圧縮ファイル ( MultiPar133.zip みたいな名前 ) を解凍してできたファイルを
|
||||
どこか適当なフォルダに全て入れてください。
|
||||
その中の MultiPar.exe というのが MultiPar の実行ファイルです。
|
||||
それをダブル・クリックすると MultiPar が起動します。
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD>̐ݒ<EFBFBD><EFBFBD>_<EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD>[<5B>g<EFBFBD>J<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>֘A<D698>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>u.par<61>v<EFBFBD><76><EFBFBD>u.par2<72>v<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>q<EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD> MultiPar <20>Ɋ֘A<D698>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́A
|
||||
<EFBFBD><EFBFBD><EFBFBD>ɑ<EFBFBD><EFBFBD>̃A<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>ł̊֘A<D698>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>ɂ<EFBFBD><C982>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>Ⴆ<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD> QuickPar <EFBFBD>Ɋ֘A<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>̂Ȃ<EFBFBD><EFBFBD>AQuickPar <20>̐ݒ<CC90><DD92>ʼn<EFBFBD><C589><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
MultiPar の設定ダイアログから、ショートカットを作ったり、
|
||||
リカバリ・ファイルを関連付けしたりできます。
|
||||
ただし、「.par」や「.par2」という拡張子のファイルを MultiPar に関連付けする場合は、
|
||||
先に他のアプリケーションでの関連付けを解除してからにしてください。
|
||||
例えば、既に QuickPar に関連付けされてるのなら、QuickPar の設定で解除しておきます。
|
||||
|
||||
[ <EFBFBD>A<EFBFBD>[<5B>J<EFBFBD>C<EFBFBD>u<EFBFBD>ł̃A<CC83><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><> ]
|
||||
[ アーカイブ版のアンインストール ]
|
||||
|
||||
<EFBFBD>@MultiPar.exe <EFBFBD>Ȃǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD><EFBFBD>ƍ폜<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>ݒ<EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD>ɍ<EFBFBD><C98D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂œ<CC82><C593><EFBFBD><EFBFBD>ɍ폜<C98D><ED8F9C><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>uProgram Files<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>ɃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́A
|
||||
<EFBFBD>ݒ<EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>́uApplication Data<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD> MultiPar <20>Ɋ֘A<D698>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>ꍇ<EFBFBD>́A
|
||||
<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>̑O<CC91>Ɋ֘A<D698>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
MultiPar.exe などを入れたフォルダごと削除してください。
|
||||
設定ファイルも同じフォルダ内に作られるので同時に削除してかまいません。
|
||||
ただし、「Program Files」内のフォルダにインストールしてあった場合は、
|
||||
設定ファイルは「Application Data」内のフォルダに作られるので、それも削除してください。
|
||||
リカバリ・ファイルを MultiPar に関連付けしてる場合は、
|
||||
アンインストールの前に関連付けを解除しておいてください。
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD><EFBFBD><EFBFBD>V<EFBFBD>F<EFBFBD><EFBFBD><EFBFBD>ɓ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃł<EFBFBD> MultiParShlExt64.dll <20>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɐݒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʂŃ`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>O<EFBFBD><4F><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar.exe <EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>ꍇ<EFBFBD>́A
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƂŃV<EFBFBD>F<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>邱<EFBFBD>Ƃ<EFBFBD><C682>ł<EFBFBD><C582>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>u<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h <20>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>g<EFBFBD>v<EFBFBD><76><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD> MultiParShlExt64.dll <20><><EFBFBD><EFBFBD><EFBFBD>݂<EFBFBD><DD82><EFBFBD><EFBFBD>f<EFBFBD>B<EFBFBD><42><EFBFBD>N<EFBFBD>g<EFBFBD><67><EFBFBD>Ɉړ<C988><DA93><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>A
|
||||
<EFBFBD>uRegSvr32.exe /u MultiParShlExt64.dll<EFBFBD>v<EFBFBD>Ɠ<EFBFBD><EFBFBD>͂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ή<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B
|
||||
<EFBFBD>G<EFBFBD>N<EFBFBD>X<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>[<5B><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>ꍇ<EFBFBD>̓t<CD83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD><ED8F9C><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Ɉ<EFBFBD><C988>U<EFBFBD><EFBFBD><C282>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>I<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>āA<EFBFBD>ēx<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>I<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>폜<EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
MultiPar をシェルに統合した状態では MultiParShlExt64.dll というファイルを削除できません。
|
||||
必ず先に設定画面でチェックを外してください。
|
||||
既に MultiPar.exe を削除してしまってる場合は、
|
||||
手作業でシェル拡張をアンインストールすることもできます。
|
||||
「コマンド プロンプト」を開いて MultiParShlExt64.dll が存在するディレクトリに移動してから、
|
||||
「RegSvr32.exe /u MultiParShlExt64.dll」と入力すれば解除されます。
|
||||
エクスプローラーを起動してる場合はファイルを削除する前に一旦閉じてください。
|
||||
それでもだめなら一旦ログオフして、再度ログオンしてから削除してください。
|
||||
|
||||
[ <EFBFBD>A<EFBFBD>[<5B>J<EFBFBD>C<EFBFBD>u<EFBFBD>ł̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>̕ύX ]
|
||||
[ アーカイブ版のインストール先の変更 ]
|
||||
|
||||
<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>̏ꏊ<CC8F><EA8F8A><EFBFBD>ς<EFBFBD><CF82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́A
|
||||
<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD><EFBFBD>ƕʂ̏ꏊ<EFBFBD>ɃR<EFBFBD>s<EFBFBD>[<5B><><EFBFBD>邩<EFBFBD>ړ<EFBFBD><DA93><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD>֘A<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>ꍇ<EFBFBD>́A<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>ʒu<CA92>f<F094BD89><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ׂɁA
|
||||
<EFBFBD>֘A<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>ݒ肵<EFBFBD>Ȃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
インストールしたフォルダの場所を変えたい時は、
|
||||
フォルダごと別の場所にコピーするか移動してください。
|
||||
パリティ書庫を関連付けをしてた場合は、新しいインストール位置を反映させる為に、
|
||||
関連付けを一旦解除してもう一度設定しなおしてください。
|
||||
|
||||
<EFBFBD>@<40>ݒ<EFBFBD><DD92>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ȂǕK<C795>v<EFBFBD>ȃt<C883>@<40>C<EFBFBD><43><EFBFBD>͑S<CD91>ē<EFBFBD><C493><EFBFBD><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD><5F><EFBFBD>ɍ<EFBFBD><C98D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA
|
||||
<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD><EFBFBD>ƃ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>o<EFBFBD>u<EFBFBD><75><EFBFBD>E<EFBFBD>f<EFBFBD>B<EFBFBD>X<EFBFBD>N<EFBFBD><4E> USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>ɕۑ<C995><DB91><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>āA
|
||||
<EFBFBD><EFBFBD><EFBFBD>̂܂ܕʂ̃p<EFBFBD>\<5C>R<EFBFBD><52><EFBFBD>Ŏg<C58E><67><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>\<5C>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>ʂ̃p<CC83>\<5C>R<EFBFBD><52><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD><DD92>Ŏg<C58E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>́A
|
||||
<EFBFBD>ݒ<EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43> (MultiPar.ini) <EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>s<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Γ<EFBFBD><CE93><EFBFBD><EFBFBD>ݒ<EFBFBD><DD92>œ<EFBFBD><C593>삵<EFBFBD>܂<EFBFBD><DC82>B
|
||||
設定ファイルなど必要なファイルは全て同じフォルダ内に作られるので、
|
||||
フォルダごとリムーバブル・ディスクや USBメモリーに保存しておいて、
|
||||
そのまま別のパソコンで使うことも可能です。
|
||||
既に MultiPar がインストールされてる別のパソコンでも同じ設定で使いたい場合は、
|
||||
設定ファイル (MultiPar.ini) をコピーすれば同じ設定で動作します。
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>Z<EFBFBD><EFBFBD><EFBFBD>X ]
|
||||
[ ライセンス ]
|
||||
|
||||
<EFBFBD>@MultiPar <EFBFBD>̓R<EFBFBD><EFBFBD><EFBFBD>\<5C>[<5B><><EFBFBD>E<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăяo<D18F><6F> GUI <20>A<EFBFBD>v<EFBFBD><76><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>K<EFBFBD>\<5C><><EFBFBD>ɂȂ<C982><C882>Ă<EFBFBD><C482>̂ŁA<C581>@<40>\<5C>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>A<EFBFBD>b<EFBFBD>v<EFBFBD><76><EFBFBD>e<EFBFBD>Ղł<D582><C582>B
|
||||
PAR <EFBFBD>p<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>\<5C>[<5B><><EFBFBD>E<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD> (par1j.exe <EFBFBD><EFBFBD> par2j.exe) <EFBFBD><EFBFBD> GPL <EFBFBD>ɏ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>̑<EFBFBD><EFBFBD>̃R<EFBFBD><EFBFBD><EFBFBD>\<5C>[<5B><><EFBFBD>E<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
GUI <EFBFBD>A<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD> (MultiPar.exe) <20>͕<EFBFBD><CD95>ʂ̃t<CC83><74><EFBFBD>[<5B>\<5C>t<EFBFBD>g<EFBFBD>ł<EFBFBD><C582>B
|
||||
MultiPar <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂܂g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>ꂼ<EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><EFBFBD>C<EFBFBD>Z<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>̈Ⴂ<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>ɂ<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>B
|
||||
<EFBFBD>\<5C>[<5B>X<EFBFBD>E<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68>GitHub<75>ɒu<C992><75><EFBFBD>Ă܂<C482><DC82>B
|
||||
MultiPar はコンソール・アプリケーションとそれを呼び出す GUI アプリケーションという
|
||||
二段階構成になってるので、機能拡張やバージョン・アップが容易です。
|
||||
PAR 用コンソール・アプリケーション (par1j.exe と par2j.exe) は GPL に準拠します。
|
||||
その他のコンソール・アプリケーションや
|
||||
GUI アプリケーション (MultiPar.exe) は普通のフリーソフトです。
|
||||
MultiPar をそのまま使うだけなら、それぞれのライセンスの違いを気にしなくていいです。
|
||||
ソース・コードはGitHubに置いてます。
|
||||
(URL: "https://github.com/Yutaka-Sawada/MultiPar")
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ <EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]
|
||||
[ 連絡先 ]
|
||||
|
||||
<EFBFBD>@<40><><EFBFBD>{<7B>I<EFBFBD>Ƀ<EFBFBD><C983>[<5B>U<EFBFBD>[<5B>E<EFBFBD>T<EFBFBD>|<7C>[<5B>g<EFBFBD>̓<EFBFBD><CD83>[<5B><><EFBFBD>ōs<C58D><73><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>A
|
||||
GitHub<EFBFBD><EFBFBD>issue<EFBFBD>y<EFBFBD>[<5B>W<EFBFBD>ɏ<EFBFBD><C98F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
基本的にユーザー・サポートはメールで行いますが、
|
||||
GitHubのissueページに書き込んでもいいです。
|
||||
(URL: "https://github.com/Yutaka-Sawada/MultiPar/issues")
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD> <20>V<EFBFBD>c <20>L <20>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>E<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD><58> tenfon (at mark) outlook.jp <EFBFBD>ł<EFBFBD><EFBFBD>B
|
||||
<EFBFBD>̂̃<EFBFBD><EFBFBD>[<5B><><EFBFBD>E<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD><58> ten_fon (at mark) mail.goo.ne.jp <EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
|
||||
2014<EFBFBD>N3<EFBFBD><EFBFBD><EFBFBD>ɃT<EFBFBD>[<5B>r<EFBFBD>X<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ͑<C982><CD91><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>悤<EFBFBD>ɂ<EFBFBD><C982>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>f<EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>ۂ̕\<5C>L<EFBFBD>Ȃ̂ŁA<C581><41><EFBFBD>ۂ̃<DB82><CC83>[<5B><><EFBFBD>ł<EFBFBD> (at mark) <EFBFBD><EFBFBD> @ <EFBFBD>Ɋ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
名前は 澤田 豊 です。
|
||||
メール・アドレスは tenfon (at mark) outlook.jp です。
|
||||
昔のメール・アドレスは ten_fon (at mark) mail.goo.ne.jp でしたが、
|
||||
2014年3月にサービス終了したので、そっちには送らないようにしてください。
|
||||
迷惑メール拒否の表記なので、実際のメールでは (at mark) を @ に換えてください。
|
||||
|
||||
|
||||
[ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>N ]
|
||||
[ リンク ]
|
||||
|
||||
<EFBFBD>@<40>x<EFBFBD>N<EFBFBD>^<5E>[<5B>̍<EFBFBD><CC8D>҃y<D283>[<5B>W<EFBFBD>ł͊O<CD8A><4F><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <20><><EFBFBD>Љ<D089>Ă<EFBFBD><C482>܂<EFBFBD><DC82>B
|
||||
ベクターの作者ページでは外国人向けに MultiPar を紹介しています。
|
||||
(URL: "https://hp.vector.co.jp/authors/VA021385/")
|
||||
<EFBFBD>x<EFBFBD>N<EFBFBD>^<5E>[<5B>̐<EFBFBD><CC90><EFBFBD><EFBFBD>ȃ_<C883>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>E<EFBFBD>y<EFBFBD>[<5B>W<EFBFBD>͕ʂɂ<CA82><C982><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
ベクターの正式なダウンロード・ページは別にあります。
|
||||
(URL: "https://www.vector.co.jp/soft/dl/winnt/util/se460801.html")
|
||||
<EFBFBD><EFBFBD><EFBFBD>{<7B>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>Ƀ<EFBFBD><C983><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>ڂ<EFBFBD><DA82><EFBFBD><EFBFBD>ۂ́A<CD81>x<EFBFBD>N<EFBFBD>^<5E>[<5B>̍<EFBFBD><CC8D>i<EFBFBD>Љ<EFBFBD><D089>y<EFBFBD>[<5B>W<EFBFBD>ɂ<EFBFBD><C982>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
日本人向けにリンクを載せる際は、ベクターの作品紹介ページにしてください。
|
||||
(URL: "https://www.vector.co.jp/soft/winnt/util/se460801.html")
|
||||
|
||||
|
||||
@@ -1,7 +1,78 @@
|
||||
Release note of v1.3.3 tree
|
||||
|
||||
par2j's "lc" option was changed to support more threads.
|
||||
Windows Vista will be removed from supported OS.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ Changes from 1.3.3.2 to 1.3.3.3 ] (2024/06/15)
|
||||
|
||||
Installer update
|
||||
Inno Setup was updated from v6.2.2 to v6.3.1.
|
||||
|
||||
PAR2 client update
|
||||
Bug fix
|
||||
Fixed a bug in GPU acceleration, when there are many OpenCL devices.
|
||||
Failure of splitting source files with numerical extension was fixed.
|
||||
Faulty prediction of the last block in a file with repeated data was fixed.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ Changes from 1.3.3.1 to 1.3.3.2 ] (2024/01/10)
|
||||
|
||||
PAR2 client update
|
||||
Improvement
|
||||
GPU acceleration will work well on AMD graphics boards.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ Changes from 1.3.3.0 to 1.3.3.1 ] (2023/11/11)
|
||||
|
||||
Installer update
|
||||
It shows dialog to select "per user" or "per machine" installation.
|
||||
|
||||
PAR2 client update
|
||||
Change
|
||||
Max number of threads to read files on SSD was increased to 6.
|
||||
|
||||
Improvement
|
||||
GPU acceleration would become faster.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ Changes from 1.3.2.9 to 1.3.3.0 ] (2023/10/10)
|
||||
|
||||
GUI update
|
||||
Change
|
||||
Option adapted to new "lc" settings.
|
||||
It's possible to add 5th item in "Media size" on Create window.
|
||||
|
||||
PAR2 client update
|
||||
Change
|
||||
Max number of using threads is increased to 32.
|
||||
Threshold to use GPU was decreased.
|
||||
|
||||
Improvement
|
||||
Matrix inversion may use more threads.
|
||||
L3 cache optimization was improved for recent CPUs.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
Release note of v1.3.2 tree
|
||||
|
||||
I tried to decrease probability of false positive at Malware detection.
|
||||
|
||||
[ Changes from 1.3.2.8 to 1.3.2.9 ] (2023/08/26)
|
||||
|
||||
GUI update
|
||||
New
|
||||
Verification may save different base directories in MultiPar.ini file.
|
||||
|
||||
Bug fix
|
||||
Archiver's option was updated for recent 7-Zip versions.
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
[ Changes from 1.3.2.7 to 1.3.2.8 ] (2023/06/08)
|
||||
|
||||
GUI update
|
||||
|
||||
@@ -1,148 +1,160 @@
|
||||
v1.3.2 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2023/06/08)
|
||||
v1.3.3 の更新情報 (2024/06/15)
|
||||
|
||||
[ 1.3.1 <20><><EFBFBD><EFBFBD> 1.3.2 <20>ւ̕ύX<CF8D>_ ]
|
||||
Windows Vista を動作対象の OS から外す予定です。
|
||||
|
||||
<EFBFBD>@<40>}<7D><><EFBFBD>E<EFBFBD>F<EFBFBD>A<EFBFBD>Ƃ<EFBFBD><C682>Č댟<C48C>m<EFBFBD><6D><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
[ 1.3.2 から 1.3.3 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <20>̕ύX<CF8D>_
|
||||
<EFBFBD>@<40><><EFBFBD>슮<EFBFBD><EC8AAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Python <20>X<EFBFBD>N<EFBFBD><4E><EFBFBD>v<EFBFBD>g<EFBFBD><67><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@Python <20>X<EFBFBD>N<EFBFBD><4E><EFBFBD>v<EFBFBD>g<EFBFBD>ō<EFBFBD><C58D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֗<EFBFBD><D697>c<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C282>lj<EFBFBD><C789><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>A<EFBFBD><41> CPU <20>p<EFBFBD>ɍœK<C593><4B><EFBFBD><EFBFBD><EFBFBD>đ<EFBFBD><C491><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
CPU Cache の利用方法を改善して速くなりました。
|
||||
GPU による高速化も速くなりました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.3.1 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2021/09/09)
|
||||
v1.3.2 の更新情報 (2023/08/26)
|
||||
|
||||
<EFBFBD>@Windows XP <20><EFBFBD><F093AE8D>Ώۂ<CE8F> OS <20><><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
マルウェアとして誤検知されにくいようにしました。
|
||||
|
||||
[ 1.3.0 <20><><EFBFBD><EFBFBD> 1.3.1 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.3.1 から 1.3.2 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40>}<7D><><EFBFBD>`<60>E<EFBFBD><45><EFBFBD>j<EFBFBD>^<5E>[<5B><EFBFBD><C28B>ɑΉ<C991><CE89><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD>C<EFBFBD>Y<EFBFBD>̍ő<CC8D><C591>l<EFBFBD><6C> 2 GB <20>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
動作完了時に Python スクリプトを呼び出せるようにしました。
|
||||
Python スクリプトで作った便利ツールをいくつか追加しました。
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@HDD <20><><EFBFBD><EFBFBD> PAR2 <20>̃<EFBFBD><CC83>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>쐬<EFBFBD><EC90AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@SSD <20><><EFBFBD><EFBFBD> PAR2 <20>̃n<CC83>b<EFBFBD>V<EFBFBD><56><EFBFBD>l<EFBFBD>v<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@OS <20><> Windows 7 <20>ȍ~<7E>Ȃ<EFBFBD><C882>ASSD <20><> HDD <20><><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>ď<EFBFBD><C48F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
複数コアの CPU 用に最適化して速くなりました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.3.0 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2020/03/03)
|
||||
v1.3.1 の更新情報 (2021/09/09)
|
||||
|
||||
[ 1.2.9 <20><><EFBFBD><EFBFBD> 1.3.0 <20>ւ̕ύX<CF8D>_ ]
|
||||
Windows XP を動作対象の OS から外しました。
|
||||
|
||||
<EFBFBD>EGUI <20>̕ύX<CF8D>_
|
||||
<EFBFBD>@<40><><EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̑傫<CC91><E582AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɐ<EFBFBD><C990><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɊO<C98A><4F><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>lj<EFBFBD><C789>ł<EFBFBD><C582><EFBFBD><EFBFBD>ʂ𑝂₵<F0919D82>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
[ 1.3.0 から 1.3.1 への変更点 ]
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@PAR1 <20>ő傫<C591>ȃt<C883>@<40>C<EFBFBD><43><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD><54><EFBFBD>v<EFBFBD>Z<EFBFBD>~<7E>X<EFBFBD><58><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@PAR2 <20>Łuchecksum mismatch<63>v<EFBFBD>G<EFBFBD><47><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>傫<EFBFBD><E582AB> VRAM <20><> GPU <20>ł<EFBFBD><C582><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
マルチ・モニター環境に対応しました。
|
||||
ブロックサイズの最大値を 2 GB にしました。
|
||||
|
||||
・クライアントの変更点
|
||||
HDD 上で PAR2 のリカバリ・ファイル作成が速くなりました。
|
||||
SSD 上で PAR2 のハッシュ値計算が速くなりました。
|
||||
OS が Windows 7 以降なら、SSD と HDD を識別して処理するようにしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.9 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2016/12/12)
|
||||
v1.3.0 の更新情報 (2020/03/03)
|
||||
|
||||
[ 1.2.8 <20><><EFBFBD><EFBFBD> 1.2.9 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.2.9 から 1.3.0 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40>v<EFBFBD><76><EFBFBD>O<EFBFBD><4F><EFBFBD>X<EFBFBD>E<EFBFBD>o<EFBFBD>[<5B><><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD>̔w<CC94>i<EFBFBD><69><EFBFBD>ύX<CF8D>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD>s<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D882>Ĕj<C494><6A><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@7-Zip <20>ƘA<C698>g<EFBFBD><67><EFBFBD>ď<EFBFBD><C48F><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
リカバリ・ファイルの大きさを常に制限するようにしました。
|
||||
検査時に外部ファイルを追加できる量を増やしました。
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40>Â<EFBFBD> CPU <20><> GPU <20>ł<EFBFBD><C582>Ȃ<EFBFBD><C882>ׂ<EFBFBD><D782><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@ZIP / 7-Zip <20><><EFBFBD>ɂɃ<C982><C983>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD><45><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>t<EFBFBD><74><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
PAR1 で大きなファイルのチェックサム計算ミスを修正しました。
|
||||
PAR2 で「checksum mismatch」エラーが発生する問題を修正しました。
|
||||
大きな VRAM の GPU でもうまく動くようにしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.8 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2015/10/27)
|
||||
v1.2.9 の更新情報 (2016/12/12)
|
||||
|
||||
<EFBFBD>@GPU <20>ɂ<EFBFBD><C982>鍂<EFBFBD><E98D82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă܂<C482><DC82>B
|
||||
[ 1.2.8 から 1.2.9 への変更点 ]
|
||||
|
||||
[ 1.2.7 <20><><EFBFBD><EFBFBD> 1.2.8 <20>ւ̕ύX<CF8D>_ ]
|
||||
・GUI の変更点
|
||||
プログレス・バー上の文字の背景を変更できるようにしました。
|
||||
実行ファイルのチェックサムを検証して破損を警告するようにしました。
|
||||
7-Zip と連携して処理できるようにしました。
|
||||
|
||||
<EFBFBD>EGUI <20>̕ύX<CF8D>_
|
||||
<EFBFBD>@<40>v<EFBFBD><76><EFBFBD>O<EFBFBD><4F><EFBFBD>X<EFBFBD>E<EFBFBD>o<EFBFBD>[<5B><><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>₷<EFBFBD><E282B7><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@GPU <20><><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD><DD92><EFBFBD><EFBFBD>ʂőI<C591><49><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@64-bit OS <20>ł<EFBFBD> 64-bit <20>ł<EFBFBD> par2j <20><><EFBFBD>Ăяo<D18F><6F><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@GPU <20><> PAR2 <20>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̔j<CC94><6A><EFBFBD><EFBFBD><EFBFBD>ʒm<CA92><6D><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
古い CPU や GPU でもなるべく速く動くようにしました。
|
||||
ZIP / 7-Zip 書庫にリカバリ・レコードを付加できるようにしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.7 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2015/05/26)
|
||||
v1.2.8 の更新情報 (2015/10/27)
|
||||
|
||||
<EFBFBD>@SSE2 (Pentium 4 <20>ȍ~<7E><> CPU <20>̊g<CC8A><67><EFBFBD>@<40>\) <20><><EFBFBD>K<EFBFBD>{<7B>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
GPU による高速化を実験してます。
|
||||
|
||||
[ 1.2.6 <20><><EFBFBD><EFBFBD> 1.2.7 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.2.7 から 1.2.8 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>啝<EFBFBD>ɕύX<CF8D><58><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD><EFBFBD>㏑<EFBFBD><E38F91><EFBFBD>ɑ<C991><CE82>Ċm<C48A>F<EFBFBD>_<EFBFBD>C<EFBFBD>A<EFBFBD><41><EFBFBD>O<EFBFBD><4F><EFBFBD>o<EFBFBD><6F><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>Z<EFBFBD>[<5B>W<EFBFBD>E<EFBFBD>{<7B>b<EFBFBD>N<EFBFBD>X<EFBFBD><58><EFBFBD>e<EFBFBD>E<EFBFBD>C<EFBFBD><43><EFBFBD>h<EFBFBD>E<EFBFBD>̒<EFBFBD><CC92><EFBFBD><EFBFBD>ɏo<C98F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
プログレス・バー上の文字を見やすくしました。
|
||||
GPU を使うかを設定画面で選択できるようにしました。
|
||||
64-bit OS では 64-bit 版の par2j を呼び出すようにしました。
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40><><EFBFBD>ꂼ<EFBFBD><EA82BC><EFBFBD>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Ƀt<C983>@<40>C<EFBFBD><43><EFBFBD>ꗗ<EFBFBD><EA9797><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>ȃt<C883>@<40>C<EFBFBD><43><EFBFBD>ɑ<C991><CE82>Ă͌<C482><CD8C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>L<EFBFBD>^<5E><><EFBFBD>Ȃ<EFBFBD><C882>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>\<5C>[<5B>X<EFBFBD>E<EFBFBD>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C282><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>Ȃǂ̌̏<CC8C><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD>ăG<C483><47><EFBFBD>[<5B>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
GPU で PAR2 の処理を高速化するようにしました。
|
||||
リカバリ・ファイルの破損も通知するようにしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.6 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2014/10/08)
|
||||
v1.2.7 の更新情報 (2015/05/26)
|
||||
|
||||
<EFBFBD>@Windows 2000 <20><EFBFBD><F093AE8D>Ώۂ<CE8F> OS <20><><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
SSE2 (Pentium 4 以降の CPU の拡張機能) が必須になりました。
|
||||
|
||||
[ 1.2.5 <20><><EFBFBD><EFBFBD> 1.2.6 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.2.6 から 1.2.7 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40>o<EFBFBD>ߕ\<5C><><EFBFBD>̃p<CC83>[<5B>Z<EFBFBD><5A><EFBFBD>g<EFBFBD><67> 0.1% <20><><EFBFBD>݂ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>E<EFBFBD><45><EFBFBD>X<EFBFBD>g<EFBFBD>ł̃t<CC83>@<40>C<EFBFBD><43><EFBFBD>̕<EFBFBD><CC95>ѕ<EFBFBD><D195><EFBFBD><EFBFBD>̂̃G<CC83>N<EFBFBD>X<EFBFBD>v<EFBFBD><76><EFBFBD>[<5B><><EFBFBD>[<5B><><EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
検査結果を表示する方式が大幅に変更されました。
|
||||
キャンセルや上書きに対して確認ダイアログを出すようにしました。
|
||||
警告等のメッセージ・ボックスが親ウインドウの中央に出現するようになりました。
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@PAR2 <20>ő傫<C591>ȃt<C883>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ<EFBFBD>A<EFBFBD>쐬<EFBFBD>╜<EFBFBD><E2959C><EFBFBD><EFBFBD><EFBFBD>ȑO<C891><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@PAR2 <20>ň<EFBFBD><C588><EFBFBD><EFBFBD>郊<EFBFBD>J<EFBFBD>o<EFBFBD><6F><EFBFBD>E<EFBFBD>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD> 65535<33>܂łɑ<C582><C991>₵<EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
それぞれのファイルを検査する前にファイル一覧を表示するようにしました。
|
||||
小さなファイルに対しては検査結果を記録しないようにしました。
|
||||
ソース・ブロックが一個だけでもリカバリ・ブロックを作れるようにしました。
|
||||
メモリーなどの故障を検出してエラー表示するようにしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.5 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2014/05/25)
|
||||
v1.2.6 の更新情報 (2014/10/08)
|
||||
|
||||
<EFBFBD>@<40>Â<EFBFBD><C382>N<EFBFBD><4E><EFBFBD>C<EFBFBD>A<EFBFBD><41><EFBFBD>g (par3j_old.exe) <20>͂<EFBFBD><CD82><EFBFBD> MultiPar <20>ł͎g<CD8E><67><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
Windows 2000 を動作対象の OS から外しました。
|
||||
|
||||
[ 1.2.4 <20><><EFBFBD><EFBFBD> 1.2.5 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.2.5 から 1.2.6 への変更点 ]
|
||||
|
||||
<EFBFBD>EGUI <EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʂɂ<CA82><C982><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>o<EFBFBD>̕\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>₷<EFBFBD><E282B7><EFBFBD>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD>ʂ<EFBFBD><CA82><EFBFBD><C282><EFBFBD><EFBFBD>ۂɁA<C981><41><EFBFBD>쒆<EFBFBD>̃N<CC83><4E><EFBFBD>C<EFBFBD>A<EFBFBD><41><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
経過表示のパーセントが 0.1% 刻みになりました。
|
||||
ファイル・リストでのファイルの並び方が昔のエクスプローラー風になりました。
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>▼<EFBFBD>O<EFBFBD><4F><EFBFBD>ύX<CF8D><58><EFBFBD>ꂽ<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƌ<EFBFBD><C68C><EFBFBD><C282><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40>ǂ̏C<CC8F><43><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߁A<DF81>I<EFBFBD><49><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ȃf<C883>[<5B>^<5E>̃X<CC83><58><EFBFBD>C<EFBFBD>X<EFBFBD><58><EFBFBD>T<EFBFBD><54><EFBFBD>ۂɃt<C983><74><EFBFBD>[<5B>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
PAR2 で大きなファイルを扱う場合、作成や復元が以前よりも速くなりました。
|
||||
PAR2 で扱えるリカバリ・ブロック数を 65535個までに増やしました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.4 <20>̍X<CC8D>V<EFBFBD><56><EFBFBD><EFBFBD> (2014/03/16)
|
||||
v1.2.5 の更新情報 (2014/05/25)
|
||||
|
||||
<EFBFBD>@<40>J<EFBFBD><4A><EFBFBD><EFBFBD><C28B><EFBFBD> Visual Studio 6.0 <20><><EFBFBD><EFBFBD> Visual Studio 2008 <20>ɕς<C995><CF82><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
古いクライアント (par3j_old.exe) はもう MultiPar では使えません。
|
||||
|
||||
[ 1.2.3 <20><><EFBFBD><EFBFBD> 1.2.4 <20>ւ̕ύX<CF8D>_ ]
|
||||
[ 1.2.4 から 1.2.5 への変更点 ]
|
||||
|
||||
<EFBFBD>E<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>̕ύX<CF8D>_
|
||||
<EFBFBD>@MultiPar <20><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>Ԃ́A<CD81>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD><C882>Ȃ<EFBFBD><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・GUI の変更点
|
||||
検査画面におけるブロック検出状況の表示が見やすくなりました。
|
||||
画面を閉じる際に、動作中のクライアントを強制終了できるようになりました。
|
||||
|
||||
<EFBFBD>EGUI <20>̕ύX<CF8D>_
|
||||
<EFBFBD>@<40><><EFBFBD><EFBFBD> MultiPar <20><><EFBFBD><EFBFBD><EFBFBD>쒆<EFBFBD>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>҂悤<C282>ɂ<EFBFBD><C982>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>@<40><><EFBFBD>當<EFBFBD><E795B6><EFBFBD>܂ł̃t<CC83>@<40>C<EFBFBD><43><EFBFBD>E<EFBFBD>p<EFBFBD>X<EFBFBD>ɑΉ<C991><CE89>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>̕ύX<EFBFBD>_
|
||||
<EFBFBD>@PAR2 <20>Ń\<5C>[<5B>X<EFBFBD>E<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɑ<EFBFBD><C991>̃t<CC83>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĂĂ<C482><C482><EFBFBD><EFBFBD>o<EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
・クライアントの変更点
|
||||
分割されたファイルや名前が変更されたファイルをもっと見つけるようになりました。
|
||||
どの修復が可能かを示すため、終了コードを拡張しました。
|
||||
似たようなデータのスライスを探す際にフリーズする問題を修正しました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
v1.2.4 の更新情報 (2014/03/16)
|
||||
|
||||
開発環境が Visual Studio 6.0 から Visual Studio 2008 に変わりました。
|
||||
|
||||
[ 1.2.3 から 1.2.4 への変更点 ]
|
||||
|
||||
・インストーラーの変更点
|
||||
MultiPar が起動してる間は、インストールやアンインストールができなくなりました。
|
||||
|
||||
・GUI の変更点
|
||||
他の MultiPar が動作中なら、その処理が終わるのを待つようにしました。
|
||||
約千文字までのファイル・パスに対応できるようになりました。
|
||||
|
||||
・クライアントの変更点
|
||||
PAR2 でソース・ファイルに他のファイルが混じってても検出できるようになりました。
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
@@ -16,7 +16,7 @@ textarea{width:100%;}
|
||||
|
||||
<p> 
|
||||
Because MultiPar consists of PAR clients and GUI,
|
||||
it is possible to use a PAR client on Command prompt.
|
||||
it is possible to use a PAR client on Command Prompt.
|
||||
Read a manual of command line for the details of command and option.
|
||||
It's available by batch file (or command script).
|
||||
</p>
|
||||
@@ -27,13 +27,57 @@ Modify the options for PAR2 files, and set the path of <tt>par2j.exe</tt>.
|
||||
Write absolute path like;<br>
|
||||
<code>SET par2_path="C:\something directory\MultiPar\par2j.exe"</code><br>
|
||||
Read manuals (<tt>Command_***.txt</tt>) to know the detail of options.
|
||||
Read Windows OS 's help for Command prompt's usage.
|
||||
Read Windows OS 's help for Command Prompt's usage.
|
||||
</p>
|
||||
<p> 
|
||||
Save a sample script to a file like <tt>batch.bat</tt> or <tt>batch.cmd</tt>.
|
||||
To specify path of files or folders, Drag & Drop them on the batch file.
|
||||
When you put a shortcut icon of the batch file in "SendTo" menu,
|
||||
you can call the batch file by selecting files then Righ-Click & SendTo.
|
||||
There are some ways to specify a file or folder.<br>
|
||||
<ol>
|
||||
<li>Type everytime by keyboard on Command Prompt
|
||||
<p> 
|
||||
If you use the batch file at Command Prompt, change directory to the batch file at first.
|
||||
Next, type <tt>batch.bat "path of the file or folder"</tt>.
|
||||
If there is no space in the path, no need to cover by <tt>""</tt>.
|
||||
The path may be absolute path or relative path from the batch file.
|
||||
Normally absolute path would be safe.
|
||||
</p>
|
||||
<p> 
|
||||
If you want to specify multiple files or folders,
|
||||
type <tt>batch.bat "path of the first file or folder" "path of second file or folder" "path of third file or folder"</tt>.
|
||||
You may add some pathes after a script filename.
|
||||
</p>
|
||||
</li>
|
||||
<li>Drag & Drop a file or folder by mouse
|
||||
<p> 
|
||||
On Windows Explorer, drag a file or folder and drop it on your batch file.
|
||||
If you put the batch file on Desktop, it will be easy to Drag & Drop.
|
||||
</p>
|
||||
<p> 
|
||||
If you want to specify multiple files or folders,
|
||||
select them at once on Windows Explorer, and Drag & Drop the group on the batch file.
|
||||
While dragging, number of items may be shown.
|
||||
</p>
|
||||
</li>
|
||||
<li>Select SendTo at Windows Explorer's right click menu
|
||||
<p> 
|
||||
At first, create Short-cut icon of your batch file.
|
||||
Name it to be something easy to understand like "Create PAR2".
|
||||
Then, put the Short-cut icon in your <tt>SendTo</tt> folder.
|
||||
You can open the <tt>SendTo</tt> folder by typing <tt>shell:sendto</tt> on path-box of Windows Explorer.
|
||||
</p>
|
||||
<p> 
|
||||
After you select a file or folder on Windows Explorer, click mouse's right button.
|
||||
Select "SendTo" item on the right-click menu.
|
||||
As your created Short-cut item will exist in the SendTo sub-menu, select the Short-cut icon.
|
||||
</p>
|
||||
<p> 
|
||||
If you want to specify multiple files or folders,
|
||||
select them at once on Windows Explorer.
|
||||
While mouse cursor over there, click mouse's right button.
|
||||
Later action is same as single item.
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
</p>
|
||||
<p> 
|
||||
If you want to confirm the result of scripting,
|
||||
@@ -60,8 +104,9 @@ you must set a local variable as "<code>setlocal enabledelayedexpansion</code>"
|
||||
<tr><td><a href="#C1">Create individual PAR2 set in each selected folder (with GUI)</a><td>
|
||||
<tr><td><a href="#C2">Create individual PAR2 set in each subfolder under a selected folder (with GUI)</a><td>
|
||||
<tr><td><a href="#C3">Create one PAR2 file per each file in a selected folder</a><td>
|
||||
<tr><td><a href="#C4">Create individual PAR2 set per each set of 4 files from many selected files</a><td>
|
||||
<tr><td><a href="#C5">Create PAR2 recovery data and append it to each original ZIP / 7-Zip archive file</a><td>
|
||||
<tr><td><a href="#C4">Create individual PAR2 set per each RAR archive in a selected folder</a><td>
|
||||
<tr><td><a href="#C5">Create individual PAR2 set per each set of 4 files from many selected files</a><td>
|
||||
<tr><td><a href="#C6">Create PAR2 recovery data and append it to each original ZIP / 7-Zip archive file</a><td>
|
||||
<tr><td><hr width="95%"></td>
|
||||
<tr><td><a href="#V1">Verify and/or Repair individual PAR2 set in each selected folder with GUI</a><td>
|
||||
<tr><td><a href="#V2">Create, Verify or Repair individual PAR2 set in each subfolder under a selected folder with GUI</a><td>
|
||||
@@ -91,7 +136,7 @@ It is possible to show GUI for setting, too.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=23 readonly wrap=off>
|
||||
<textarea cols=64 rows=22 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -121,7 +166,7 @@ When a GUI is closed, next GUI is opened with next folder.
|
||||
You may set an option in "Automated tasks" to close GUI automatically after creation.
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=21 readonly wrap=off>
|
||||
<textarea cols=64 rows=20 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -150,7 +195,7 @@ Because all MultiPar GUIs will open at once for each folder,
|
||||
you can start each creation anytime.
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=21 readonly wrap=off>
|
||||
<textarea cols=64 rows=20 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -185,7 +230,7 @@ For example, when there are 7 subfolders, total 7 PAR2 set are made.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=33 readonly wrap=off>
|
||||
<textarea cols=64 rows=29 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -229,7 +274,7 @@ You may check "Always use folder name for base filename" option in "Client behav
|
||||
then each PAR2 set is named by the folder.
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=33 readonly wrap=off>
|
||||
<textarea cols=64 rows=29 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -276,7 +321,7 @@ For example, when there are 7 files in the folder, total 7 PAR2 files are made.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=33 readonly wrap=off>
|
||||
<textarea cols=64 rows=29 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -315,6 +360,80 @@ By this option, index file isn't created.
|
||||
<hr>
|
||||
|
||||
<a name="C4"></a>
|
||||
<h3>Create individual PAR2 set per each RAR archive in a selected folder</h3>
|
||||
<p>
|
||||
<table border=1 cellspacing=0 cellpadding=2 width="100%">
|
||||
<tr><td>Command<td>"path of batch file" "path of a folder"
|
||||
<tr><td>Input<td>specify a folder
|
||||
<tr><td>Action<td>This sample creates individual PAR2 set per each RAR archive file(s) in the selected folder.
|
||||
If RAR archive is single file, PAR2 files are created for it.
|
||||
If RAR archive is splitted into multiple files, PAR2 files are created for them.
|
||||
When you don't select any folder, it will search RAR files in current directory (where the script exists normally).
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=52 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL enabledelayedexpansion
|
||||
|
||||
REM check input path
|
||||
IF "%~1"=="" GOTO Start
|
||||
IF NOT EXIST "%~1" (
|
||||
ECHO The path does not exist.
|
||||
GOTO End
|
||||
)
|
||||
PUSHD %1
|
||||
:Start
|
||||
|
||||
REM set paramaters for PAR2 client
|
||||
SET par2_path="path of par2j.exe"
|
||||
SET REDUNDANCY_PERCENT=15
|
||||
SET PAR2_FILES=3
|
||||
|
||||
REM search file of each single RAR archive
|
||||
FOR %%F in (*.rar) do (
|
||||
REM check ".part" in splitted RAR files
|
||||
ECHO "%%~nF" | find ".part" >NUL
|
||||
if ERRORLEVEL==1 (
|
||||
REM when filename doesn't include ".part", create PAR2 file for the RAR file.
|
||||
ECHO Creating parity archives for %%F...
|
||||
%par2_path% c /rr%REDUNDANCY_PERCENT% /rf%PAR2_FILES% /rd1 "%%~nF.par2" "%%F"
|
||||
ECHO Parity archives created for %%F.
|
||||
ECHO.
|
||||
)
|
||||
)
|
||||
|
||||
REM search the first file of each splitted RAR archive
|
||||
FOR %%F in ("*.part1.rar" "*.part01.rar" "*.part001.rar") do (
|
||||
call :SUB_CREATE "%%~nF"
|
||||
)
|
||||
|
||||
POPD
|
||||
ECHO Parity archive creation complete.
|
||||
PAUSE
|
||||
|
||||
GOTO End
|
||||
|
||||
REM sub-routine to create PAR files for multiple input files
|
||||
:SUB_CREATE
|
||||
ECHO Creating parity archives for multiple %~n1...
|
||||
%par2_path% c /rr%REDUNDANCY_PERCENT% /rf%PAR2_FILES% /rd1 "%~n1.par2" "%~n1.part*.rar"
|
||||
ECHO Parity archives created for multiple %~n1.
|
||||
ECHO.
|
||||
|
||||
GOTO :EOF
|
||||
|
||||
:End
|
||||
ENDLOCAL</textarea>
|
||||
|
||||
<p> 
|
||||
The script calls <code>Find.exe</code> and for certain Windows versions,
|
||||
you may have to add <code>C:\Windows\System32</code> to Windows System Path if not already present.
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
|
||||
<a name="C5"></a>
|
||||
<h3>Create individual PAR2 set per each set of 4 files from many selected files</h3>
|
||||
<p>
|
||||
<table border=1 cellspacing=0 cellpadding=2 width="100%">
|
||||
@@ -361,7 +480,7 @@ Be careful about the number of source files and "<code>SHIFT</code>" per each st
|
||||
|
||||
<hr>
|
||||
|
||||
<a name="C5"></a>
|
||||
<a name="C6"></a>
|
||||
<h3>Create PAR2 recovery data and append it to each original ZIP / 7-Zip archive file</h3>
|
||||
<p>
|
||||
<table border=1 cellspacing=0 cellpadding=2 width="100%">
|
||||
@@ -449,7 +568,7 @@ When a GUI is closed, next GUI is opened with next PAR2 set.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=21 readonly wrap=off>
|
||||
<textarea cols=64 rows=20 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -492,7 +611,7 @@ Next time you specify the folder, MultiPar verifies the 7 subfolders one by one.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=38 readonly wrap=off>
|
||||
<textarea cols=64 rows=34 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -555,7 +674,7 @@ but it's invisible by Windows Explorer.
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=38 readonly wrap=off>
|
||||
<textarea cols=64 rows=37 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
@@ -619,7 +738,7 @@ Checksum data must have been saved in an alternate stream "<tt>original filename
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<textarea cols=64 rows=43 readonly wrap=off>
|
||||
<textarea cols=64 rows=42 readonly wrap=off>
|
||||
@ECHO OFF
|
||||
SETLOCAL
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ There are command-line manuals in "<tt>help</tt>" folder.
|
||||
</table>
|
||||
|
||||
<hr>
|
||||
<small>last update 2023/03/20 for version 1.3.2.8</small>
|
||||
<small>last update 2024/04/13 for version 1.3.3.3</small>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -173,7 +173,8 @@ It will verify each PAR2 set continuously.
|
||||
It's possible to stop queue on GUI.
|
||||
<tr><td>Script file<td><tt>queue_verify.py</tt>
|
||||
<tr><td>Caution<td>You must select MultiPar Option: "Re-use verification result" to be "For 3 days" or longer,
|
||||
and you should check "Don't search subfolders" in "Verification and Repair options" section on "Client behavior" tab.
|
||||
and you should check "Don't search subfolders" in "Verification and Repair options" section on "Client behavior" tab.
|
||||
Furthermore, you must set proper <tt>save_path</tt> in the script.
|
||||
</table>
|
||||
</p>
|
||||
<p> 
|
||||
|
||||
@@ -31,7 +31,14 @@ Be careful to use those special features.
|
||||
|
||||
<h3>System requirement</h3>
|
||||
<p> 
|
||||
MultiPar requires a PC with Windows Vista or later (Windows 7, 8, 10).
|
||||
MultiPar requires a PC with Windows Vista or later (Windows 7, 8, 10, 11).
|
||||
</p>
|
||||
|
||||
<h3>Usage manual or Help documents</h3>
|
||||
<p> 
|
||||
There are some usage manual or help documents in "help" folder.
|
||||
English pages exists in "help/0409" folder.
|
||||
You may open the manual by pushing "F1-key", while using MultiPar.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
@@ -8,14 +8,13 @@
|
||||
|
||||
<h3>Install or uninstall with installer package</h3>
|
||||
<p> 
|
||||
Double click setup file ( <tt>MultiPar131_setup.exe</tt> or something like this name ),
|
||||
Double click setup file ( <tt>MultiPar133_setup.exe</tt> or something like this name ),
|
||||
and follow the installer dialog.
|
||||
At version up, if you want to use previous setting, overwrite install is possible.
|
||||
Before overwrite install, you should un-check "Integrate MultiPar into Shell".
|
||||
You may need to re-start OS after overwrite install or uninstall rarely.
|
||||
To install under "<tt>Program Files</tt>" or "<tt>Program Files (x86)</tt>" directory,
|
||||
you must start the installer with administrative privileges by selecting
|
||||
"Run as administrator" on right-click menu.
|
||||
you must select "Install for all users" at the first dialog.
|
||||
</p>
|
||||
<p> 
|
||||
You can uninstall through the Windows OS's Control Panel,
|
||||
@@ -42,7 +41,7 @@ In either case, user made icons and association are available for the user only.
|
||||
|
||||
<h3>Install with archive version</h3>
|
||||
<p> 
|
||||
Unpack compressed file ( <tt>MultiPar131.zip</tt> or something like this name ) in a folder.
|
||||
Unpack compressed file ( <tt>MultiPar133.zip</tt> or something like this name ) in a folder.
|
||||
<tt>MultiPar.exe</tt> is the interface of MultiPar.
|
||||
</p>
|
||||
<p> 
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
</table>
|
||||
|
||||
<hr>
|
||||
<small><EFBFBD>ŏI<EFBFBD>X<EFBFBD>V 2023/02/27 (<28>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD> 1.3.2.8)</small>
|
||||
<small><EFBFBD>ŏI<EFBFBD>X<EFBFBD>V 2024/04/13 (<28>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD> 1.3.3.3)</small>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -25,7 +25,14 @@ QuickPar
|
||||
|
||||
<h3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></h3>
|
||||
<p> 
|
||||
Windows Vista <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȍ~ (Windows 7, 8, 10) <20>̃p<CC83>\<5C>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ł<EFBFBD><C582>B
|
||||
Windows Vista <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȍ~ (Windows 7, 8, 10, 11) <20>̃p<CC83>\<5C>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ł<EFBFBD><C582>B
|
||||
</p>
|
||||
|
||||
<h3><EFBFBD>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></h3>
|
||||
<p> 
|
||||
<EFBFBD>قƂ<EFBFBD><EFBFBD>ljp<EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ahelp <20>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>[<5B>̒<EFBFBD><CC92>Ɏg<C98E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă܂<C482><DC82>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD>̃y<CC83>[<5B>W<EFBFBD><57> help\0411 <20>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>[<5B>̒<EFBFBD><CC92>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
MultiPar <20>̎g<CC8E>p<EFBFBD><70><EFBFBD>ɁAF1-key <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁA<C681>}<7D>j<EFBFBD><6A><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
@@ -8,14 +8,13 @@
|
||||
|
||||
<h3><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B>ł̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>ƃA<C683><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><></h3>
|
||||
<p> 
|
||||
<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[ ( <tt>MultiPar131_setup.exe</tt> <20>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȗ<EFBFBD><C896>O ) <20><><EFBFBD>_<EFBFBD>u<EFBFBD><75><EFBFBD>E<EFBFBD>N<EFBFBD><4E><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>ƁA
|
||||
<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[ ( <tt>MultiPar133_setup.exe</tt> <20>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȗ<EFBFBD><C896>O ) <20><><EFBFBD>_<EFBFBD>u<EFBFBD><75><EFBFBD>E<EFBFBD>N<EFBFBD><4E><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>ƁA
|
||||
<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>ʂ<EFBFBD><CA82>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581><41><EFBFBD>̎w<CC8E><77><EFBFBD>ɏ]<5D><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>A<EFBFBD>b<EFBFBD>v<EFBFBD><76><EFBFBD>ɁA<C981>ݒ荀<DD92>ڂ<EFBFBD><DA82><EFBFBD><EFBFBD>̂܂g<DC8E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͏㏑<CD8F><E38F91><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD>㏑<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɁA<C981>uMultiPar <20><><EFBFBD>V<EFBFBD>F<EFBFBD><46><EFBFBD>ɓ<EFBFBD><C993><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>O<EFBFBD><4F><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>㏑<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>C<EFBFBD><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OS <20>̍ċN<C48B><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82><EFBFBD><EFBFBD>邩<EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
|
||||
<EFBFBD>u<tt>Program Files</tt><EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>u<tt>Program Files (x86)</tt><EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>ɃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ́A
|
||||
<EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD>[<5B>́u<CC81>Ǘ<EFBFBD><C797>҂Ƃ<D282><C682>Ď<EFBFBD><C48E>s<EFBFBD>v<EFBFBD><76><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD>
|
||||
<EFBFBD>Ǘ<EFBFBD><EFBFBD>Ҍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŃC<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>[<5B><><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
<EFBFBD>ŏ<EFBFBD><EFBFBD>̃_<EFBFBD>C<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Łu<EFBFBD><EFBFBD><EFBFBD>ׂẴ<EFBFBD><EFBFBD>[<5B>U<EFBFBD>[<5B>p<EFBFBD>ɃC<C983><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD>v<EFBFBD><76><EFBFBD>I<EFBFBD><49><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
</p>
|
||||
<p> 
|
||||
<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><><EFBFBD><EFBFBD> Windows OS <20>̃R<CC83><52><EFBFBD>g<EFBFBD><67><EFBFBD>[<5B><><EFBFBD>E<EFBFBD>p<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>A
|
||||
@@ -43,7 +42,7 @@ MultiPar
|
||||
|
||||
<h3><EFBFBD>A<EFBFBD>[<5B>J<EFBFBD>C<EFBFBD>u<EFBFBD>ł̃C<CC83><43><EFBFBD>X<EFBFBD>g<EFBFBD>[<5B><></h3>
|
||||
<p> 
|
||||
<EFBFBD>z<EFBFBD>z<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă鈳<EFBFBD>k<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43> ( <tt>MultiPar131.zip</tt> <20>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȗ<EFBFBD><C896>O ) <20><><EFBFBD>𓀂<EFBFBD><F0938082>Ăł<C482><C582><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
|
||||
<EFBFBD>z<EFBFBD>z<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă鈳<EFBFBD>k<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43> ( <tt>MultiPar133.zip</tt> <20>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȗ<EFBFBD><C896>O ) <20><><EFBFBD>𓀂<EFBFBD><F0938082>Ăł<C482><C582><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
|
||||
<EFBFBD>ǂ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD><EFBFBD><EFBFBD>ȃt<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>ɑS<EFBFBD>ē<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||||
<EFBFBD><EFBFBD><EFBFBD>̒<EFBFBD><EFBFBD><EFBFBD> <tt>MultiPar.exe</tt> <20>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>̂<EFBFBD> MultiPar <20>̎<EFBFBD><CC8E>s<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ł<EFBFBD><C582>B
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MultiPar <20><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</table>
|
||||
|
||||
<hr>
|
||||
<small>最新更新于2023年2月27日,适用于1.3.2.8版本,简体中文化 Deng Shiqing</small>
|
||||
<small>最新更新于2023年11月11日,适用于1.3.3.1版本,简体中文化 Deng Shiqing</small>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
<h3>使用安装包安装或卸载</h3>
|
||||
<p> 
|
||||
双击安装文件(<tt>MultiPar131_setup.exe</tt>或类似名称文件),然后按照安装程序对话框进行操作。在版本升级时,如果要使用先前的设置,可以进行覆盖安装。在覆盖安装之前, 应取消勾选“将MultiPar整合到右键菜单”。在写入安装或卸载之后,您可能需要重新启动操作系统。“<tt>Program Files</tt>”或“<tt>Program Files (x86)</tt>”目录下,必须在右键菜单上选择“以管理员身份运行”,用管理员权限启动安装程序。
|
||||
双击安装文件(<tt>MultiPar133_setup.exe</tt>或类似名称文件),然后按照安装程序对话框进行操作。在版本升级时,如果要使用先前的设置,可以进行覆盖安装。在覆盖安装之前, 应取消勾选“将MultiPar整合到右键菜单”。在写入安装或卸载之后,您可能需要重新启动操作系统。要在“<tt>Program Files</tt>”或“<tt>Program Files (x86)</tt>”目录下安装,您必须在第一个对话框中选择“为所有用户安装”。
|
||||
</p>
|
||||
<p> 
|
||||
您可以通过Windows操作系统的控制面板卸载程序,或双击MultiPar安装文件夹中的<tt>unins000.exe</tt>。由于卸载程序不会删除设置文件或安装后新添加的文件,因此您可以自行删除它们。
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
<h3>使用压缩包安装</h3>
|
||||
<p> 
|
||||
在文件夹中解压压缩文件(<tt>MultiPar131.zip</tt>或类似名称文件)。
|
||||
在文件夹中解压压缩文件(<tt>MultiPar133.zip</tt>或类似名称文件)。
|
||||
<tt>MultiPar.exe</tt>是MultiPar的启动程序。
|
||||
</p>
|
||||
<p> 
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[ MultiPar GUI - version 1.3.2.6 or later ]
|
||||
[ MultiPar GUI - version 1.3.3.3 or later ]
|
||||
|
||||
Usage: MultiPar.exe [command] [/base path] [/list path] [files]
|
||||
|
||||
@@ -99,6 +99,24 @@ write a line of "RecoveryFileLimit=1" under "[Option]" section.
|
||||
It's same as an option:
|
||||
"Variable (limited to size of largest data file)" on QuickPar.
|
||||
|
||||
If you want to limit size of Recovery Files by a specific value,
|
||||
write a line of "RecoveryFileLimit=2" under "[Option]" section.
|
||||
"Limit Size to" value is enabled, even when "Split Files" isn't checked.
|
||||
This setting is useful, if you don't want to split source files.
|
||||
|
||||
If you want to enable "Most Resent Used List",
|
||||
write this line "MRUMax=5" under "[Path]" section.
|
||||
You may change the number of items after "MRUMax=".
|
||||
Because of alphabet, "MRUMax=26" is the maximum.
|
||||
If you write "MRUMax=0" or remove the line,
|
||||
"Most Resent Used List" is disabled.
|
||||
|
||||
If you want to add 5th item in "Media size" list on Create window,
|
||||
write this line "MediaList4=name:size" under "[Option]" section.
|
||||
Because the name and size are splitted by ":",
|
||||
you cannot include ":" in the name.
|
||||
The max size is 999999999999 bytes. (931 GB)
|
||||
|
||||
|
||||
Example of lines on "MultiPar.ini";
|
||||
|
||||
@@ -107,4 +125,6 @@ FontName=Arial
|
||||
RedundancyMax=10
|
||||
Sort=8
|
||||
RecoveryFileLimit=1
|
||||
|
||||
MediaList4=7.9GB DVD:8480000000
|
||||
[Path]
|
||||
MRUMax=5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[ par2j.exe - version 1.3.2.8 or later ]
|
||||
[ par2j.exe - version 1.3.3.2 or later ]
|
||||
|
||||
Type "par2j.exe" to see version, test integrity, and show usage below.
|
||||
|
||||
@@ -359,21 +359,32 @@ the protected archive file is made in the directory.
|
||||
/lc :
|
||||
Set this, if you want to set number of using threads for Multi-Core CPU,
|
||||
or want to disable extra feature. (SSE2 is always used.)
|
||||
The format is "/lc#", # is from 1 to 11 as the number of using threads,
|
||||
12 to use quarter number of physical Cores,
|
||||
13 to use half of physical Cores,
|
||||
14 to use 3/4 number of physical Cores,
|
||||
15 to use the number of physical Cores (disable Hyper Threading),
|
||||
or 15 to use one less number of physical Cores on CPU with 6 or more physical Cores.
|
||||
Without this option (or /lc0),
|
||||
it uses the number of physical Cores on CPU with 6 or more physical Cores,
|
||||
or one more threads on CPU with Hyper Threading and 5 or less physical Cores.
|
||||
The format is "/lc#" (# is from 1 to 32 as the number of using threads).
|
||||
|
||||
You may set additional combinations; +16 to disable SSSE3,
|
||||
+128 to disable CLMUL, +256 to disable JIT, +512 to disable AVX2,
|
||||
+32 or +64 (slower device) to enable GPU acceleration.
|
||||
It's possible to set by rate as following. (It's /lc0 by default.)
|
||||
251: It uses quarter number of physical Cores.
|
||||
252: It uses half of physical Cores.
|
||||
253: It uses 3/4 number of physical Cores.
|
||||
254: It uses one less threads than number of physical Cores.
|
||||
0: It uses the number of physical Cores.
|
||||
255: It tries to use more threads than number of physical Cores.
|
||||
|
||||
for example, /lc1 to use single Core, /lc45 to use half Cores and GPU
|
||||
You may set additional combinations for CPU feature;
|
||||
+1024 to disable CLMUL (and use slower SSSE3 code)
|
||||
+2048 to disable JIT (for SSE2)
|
||||
+4096 to disable SSSE3
|
||||
+8192 to disable AVX2
|
||||
|
||||
You may set additional combinations for GPU control;
|
||||
+256 or +512 (slower device) to enable GPU acceleration
|
||||
+65536 for classic method
|
||||
+131072 for 16-byte memory access
|
||||
+262144 for 4-byte memory access and calculate 2 blocks at once
|
||||
+524288 for 16-byte memory access and calculate 2 blocks at once
|
||||
+1048576 for CL_MEM_COPY_HOST_PTR or +2097152 for CL_MEM_USE_HOST_PTR
|
||||
(When you set exclusive bits, larger value will be used.)
|
||||
|
||||
for example, /lc1 to use single Core, /lc508 to use half Cores and GPU
|
||||
|
||||
/m :
|
||||
Set this, if you want to set memory usage.
|
||||
|
||||
BIN
alpha/par2j.exe
BIN
alpha/par2j.exe
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
[ par2j.exe - version 1.3.2.8 or later ]
|
||||
[ par2j.exe - version 1.3.3.2 or later ]
|
||||
|
||||
Type "par2j.exe" to see version, test integrity, and show usage below.
|
||||
|
||||
@@ -359,21 +359,32 @@ the protected archive file is made in the directory.
|
||||
/lc :
|
||||
Set this, if you want to set number of using threads for Multi-Core CPU,
|
||||
or want to disable extra feature. (SSE2 is always used.)
|
||||
The format is "/lc#", # is from 1 to 11 as the number of using threads,
|
||||
12 to use quarter number of physical Cores,
|
||||
13 to use half of physical Cores,
|
||||
14 to use 3/4 number of physical Cores,
|
||||
15 to use the number of physical Cores (disable Hyper Threading),
|
||||
or 15 to use one less number of physical Cores on CPU with 6 or more physical Cores.
|
||||
Without this option (or /lc0),
|
||||
it uses the number of physical Cores on CPU with 6 or more physical Cores,
|
||||
or one more threads on CPU with Hyper Threading and 5 or less physical Cores.
|
||||
The format is "/lc#" (# is from 1 to 32 as the number of using threads).
|
||||
|
||||
You may set additional combinations; +16 to disable SSSE3,
|
||||
+128 to disable CLMUL, +256 to disable JIT, +512 to disable AVX2,
|
||||
+32 or +64 (slower device) to enable GPU acceleration.
|
||||
It's possible to set by rate as following. (It's /lc0 by default.)
|
||||
251: It uses quarter number of physical Cores.
|
||||
252: It uses half of physical Cores.
|
||||
253: It uses 3/4 number of physical Cores.
|
||||
254: It uses one less threads than number of physical Cores.
|
||||
0: It uses the number of physical Cores.
|
||||
255: It tries to use more threads than number of physical Cores.
|
||||
|
||||
for example, /lc1 to use single Core, /lc45 to use half Cores and GPU
|
||||
You may set additional combinations for CPU feature;
|
||||
+1024 to disable CLMUL (and use slower SSSE3 code)
|
||||
+2048 to disable JIT (for SSE2)
|
||||
+4096 to disable SSSE3
|
||||
+8192 to disable AVX2
|
||||
|
||||
You may set additional combinations for GPU control;
|
||||
+256 or +512 (slower device) to enable GPU acceleration
|
||||
+65536 for classic method
|
||||
+131072 for 16-byte memory access
|
||||
+262144 for 4-byte memory access and calculate 2 blocks at once
|
||||
+524288 for 16-byte memory access and calculate 2 blocks at once
|
||||
+1048576 for CL_MEM_COPY_HOST_PTR or +2097152 for CL_MEM_USE_HOST_PTR
|
||||
(When you set exclusive bits, larger value will be used.)
|
||||
|
||||
for example, /lc1 to use single Core, /lc508 to use half Cores and GPU
|
||||
|
||||
/m :
|
||||
Set this, if you want to set memory usage.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// common2.c
|
||||
// Copyright : 2023-03-14 Yutaka Sawada
|
||||
// Copyright : 2023-10-13 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -1848,9 +1848,10 @@ int sqrt32(int num)
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
int cpu_num = 1; // CPU/Core 個数が制限されてる場合は、上位に本来の数を置く
|
||||
// /arch:SSE2, +1=SSSE3, +2=SSE4.1, +4=SSE4.2, +8=CLMUL, +16=AVX2, +128=JIT(SSE2), +256=Old
|
||||
// /arch:SSE2, +1=SSSE3, +2=SSE4.1, +4=SSE4.2, +8=CLMUL, +16=AVX2, +128=JIT(SSE2), +256=ALTMAPなし
|
||||
// 上位 16-bit = L2 cache サイズから計算した制限サイズ
|
||||
unsigned int cpu_flag = 0;
|
||||
unsigned int cpu_cache = 0; // 上位 16-bit = L2 cache * 2, 下位 16-bit = L3 cache
|
||||
unsigned int cpu_cache = 0; // 上位 16-bit = L3 cache の制限サイズ, 下位 16-bit = 同時処理数
|
||||
unsigned int memory_use = 0; // メモリー使用量 0=auto, 1~7 -> 1/8 ~ 7/8
|
||||
|
||||
static int count_bit(DWORD_PTR value)
|
||||
@@ -1869,7 +1870,7 @@ static int count_bit(DWORD_PTR value)
|
||||
void check_cpu(void)
|
||||
{
|
||||
int core_count = 0, use_count;
|
||||
unsigned int CPUInfo[4];
|
||||
unsigned int CPUInfo[4], limit_size = 0;
|
||||
unsigned int returnLength, byteOffset;
|
||||
DWORD_PTR ProcessAffinityMask, SystemAffinityMask; // 32-bit なら 4バイト、64-bit なら 8バイト整数
|
||||
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL, ptr;
|
||||
@@ -2006,42 +2007,52 @@ void check_cpu(void)
|
||||
//printf("Number of available physical processor cores: %d\n", core_count);
|
||||
if (cache3_size > 0){
|
||||
//printf("L3 cache: %d KB (%d way)\n", cache3_size >> 10 , cache3_way);
|
||||
cache3_size /= cache3_way; // set-associative のサイズにする
|
||||
if (cache3_size < 131072)
|
||||
cache3_size = 128 << 10; // 128 KB 以上にする
|
||||
cpu_cache = cache3_size / cache3_way; // set-associative のサイズにする
|
||||
if (cpu_cache < 131072)
|
||||
cpu_cache = 128 << 10; // 128 KB 以上にする
|
||||
}
|
||||
if (cache2_size > 0){
|
||||
//printf("L2 cache: %d KB (%d way)\n", cache2_size >> 10, cache2_way);
|
||||
cache2_size /= cache2_way; // set-associative のサイズにする
|
||||
if (cache2_size < 32768)
|
||||
cache2_size = 32 << 10; // 32 KB 以上にする
|
||||
//printf("Limit size of Cache Blocking: %d KB\n", cache2_size >> 10);
|
||||
cpu_cache = cache2_size | (cache3_size >> 17);
|
||||
limit_size = cache2_size / cache2_way; // set-associative のサイズにする
|
||||
if (limit_size < 65536)
|
||||
limit_size = 64 << 10; // 64 KB 以上にする
|
||||
// 同時処理数を決める
|
||||
if (cache2_way >= 16){
|
||||
returnLength = cache2_way / 2; // L2 cache の分割数が多い場合は、その半分にする
|
||||
} else {
|
||||
returnLength = 0;
|
||||
}
|
||||
if (cache3_size > 0){ // L2 cache に対する L3 cache のサイズの倍率にする
|
||||
byteOffset = cache3_size / cache2_size;
|
||||
if (returnLength < byteOffset){
|
||||
returnLength = byteOffset;
|
||||
if (cache2_way >= cache3_way) // L2 cache の分割数が L3 cache 以上なら 1.5倍にする
|
||||
returnLength += returnLength / 2;
|
||||
}
|
||||
}
|
||||
cpu_cache |= returnLength & 0x1FFFF;
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu_cache == 0) // キャッシュ・サイズが不明なら、128 KB にする
|
||||
cpu_cache = 128 << 10;
|
||||
if (limit_size == 0) // キャッシュ・サイズが不明なら、128 KB にする
|
||||
limit_size = 128 << 10;
|
||||
//printf("Limit size of Cache Blocking: %d KB\n", limit_size >> 10);
|
||||
// cpu_flag の上位 16-bit にキャッシュの制限サイズを置く
|
||||
cpu_flag |= limit_size & 0xFFFF0000; // 64 KB 未満は無視する
|
||||
|
||||
if (core_count == 0){ // 物理コア数が不明なら、論理コア数と同じにする
|
||||
core_count = cpu_num;
|
||||
use_count = cpu_num;
|
||||
} else if (core_count < cpu_num){ // 物理コア数が共有されてるなら
|
||||
if (core_count >= 6){ // 6 コア以上ならそれ以上増やさない
|
||||
use_count = core_count;
|
||||
} else { // 2~5 コアなら 1個だけ増やす
|
||||
use_count = core_count + 1;
|
||||
}
|
||||
} else if (core_count < cpu_num){ // 物理コアが共有されてるなら
|
||||
use_count = core_count; // 物理コア数と同じにする
|
||||
} else {
|
||||
use_count = core_count;
|
||||
use_count = cpu_num; // 論理コア数と同じにする
|
||||
}
|
||||
if (use_count > MAX_CPU) // 利用するコア数が実装上の制限を越えないようにする
|
||||
use_count = MAX_CPU;
|
||||
//printf("Core count: logical, physical, use = %d, %d, %d\n", cpu_num, core_count, use_count);
|
||||
// 上位に論理コア数と物理コア数、下位に利用するコア数を配置する
|
||||
cpu_num = (cpu_num << 24) | (core_count << 16) | use_count;
|
||||
|
||||
// cpu_flag の上位 17-bit にキャッシュの制限サイズを置く
|
||||
cpu_flag |= cpu_cache & 0xFFFF8000; // 32 KB 未満は無視する
|
||||
}
|
||||
|
||||
// OS が 32-bit か 64-bit かを調べる
|
||||
|
||||
@@ -6,11 +6,11 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _WIN64 // 32-bit 版なら
|
||||
#define MAX_CPU 8 // 32-bit 版は少なくしておく
|
||||
#define MAX_CPU 16 // 32-bit 版は少なくしておく
|
||||
#define MAX_MEM_SIZE 0x7F000000 // 確保するメモリー領域の最大値 2032MB
|
||||
#define MAX_MEM_SIZE32 0x50000000 // 32-bit OS で確保するメモリー領域の最大値 1280MB
|
||||
#else
|
||||
#define MAX_CPU 16 // 最大 CPU/Core 個数 (スレッド本数)
|
||||
#define MAX_CPU 32 // 最大 CPU/Core 個数 (スレッド本数)
|
||||
#endif
|
||||
|
||||
#define MAX_LEN 1024 // ファイル名の最大文字数 (末尾のNULL文字も含む)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// create.c
|
||||
// Copyright : 2022-02-16 Yutaka Sawada
|
||||
// Copyright : 2024-02-09 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -26,6 +26,11 @@
|
||||
|
||||
//#define TIMER // 実験用
|
||||
|
||||
#ifdef TIMER
|
||||
#include <time.h>
|
||||
static double time_sec, time_speed;
|
||||
#endif
|
||||
|
||||
// ソート時に項目を比較する
|
||||
static int sort_cmp(const void *elem1, const void *elem2)
|
||||
{
|
||||
@@ -196,7 +201,7 @@ int set_common_packet(
|
||||
__int64 prog_now = 0;
|
||||
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
print_progress_text(0, "Computing file hash");
|
||||
|
||||
@@ -305,14 +310,14 @@ unsigned int time_start = GetTickCount();
|
||||
off += (64 + main_packet_size);
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("hash %d.%03d sec", time_start / 1000, time_start % 1000);
|
||||
if (time_start > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_start * 131072));
|
||||
printf(", %d MB/s\n", time_start);
|
||||
time_start = clock() - time_start;
|
||||
time_sec = (double)time_start / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
printf("\n");
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("hash %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
|
||||
error_end:
|
||||
@@ -320,7 +325,7 @@ error_end:
|
||||
return off;
|
||||
}
|
||||
|
||||
#define MAX_MULTI_READ 4 // SSDで同時に読み込む最大ファイル数
|
||||
#define MAX_MULTI_READ 6 // SSDで同時に読み込む最大ファイル数
|
||||
|
||||
// SSD 上で複数ファイルのハッシュ値を同時に求めるバージョン
|
||||
int set_common_packet_multi(
|
||||
@@ -341,18 +346,16 @@ int set_common_packet_multi(
|
||||
FILE_HASH_TH th[MAX_MULTI_READ];
|
||||
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
|
||||
memset(hSub, 0, sizeof(HANDLE) * MAX_MULTI_READ);
|
||||
memset(th, 0, sizeof(FILE_HASH_TH) * MAX_MULTI_READ);
|
||||
// Core数に応じてスレッド数を増やす
|
||||
if ((memory_use & 32) != 0){ // NVMe SSD
|
||||
if (cpu_num >= 8){ // 8 ~ 16 Cores
|
||||
multi_read = 4;
|
||||
} else { // 3 Cores + Hyper-threading, or 4 ~ 7 Cores
|
||||
multi_read = 3;
|
||||
}
|
||||
multi_read = (cpu_num + 2) / 3 + 1; // 3=2, 4~6=3, 7~9=4, 10~12=5, 13~=6
|
||||
if (multi_read > MAX_MULTI_READ)
|
||||
multi_read = MAX_MULTI_READ;
|
||||
} else { // SATA SSD
|
||||
multi_read = 2;
|
||||
}
|
||||
@@ -547,14 +550,14 @@ unsigned int time_start = GetTickCount();
|
||||
}
|
||||
print_progress_done(); // 改行して行の先頭に戻しておく
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("hash %d.%03d sec", time_start / 1000, time_start % 1000);
|
||||
if (time_start > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_start * 131072));
|
||||
printf(", %d MB/s\n", time_start);
|
||||
time_start = clock() - time_start;
|
||||
time_sec = (double)time_start / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
printf("\n");
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("hash %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
|
||||
error_end:
|
||||
@@ -702,7 +705,7 @@ int set_common_packet_hash(
|
||||
__int64 prog_now = 0;
|
||||
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
print_progress_text(0, "Computing file hash");
|
||||
|
||||
@@ -742,8 +745,8 @@ unsigned int time_start = GetTickCount();
|
||||
print_progress_done(); // 改行して行の先頭に戻しておく
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("hash %d.%03d sec\n", time_start / 1000, time_start % 1000);
|
||||
time_start = clock() - time_start;
|
||||
printf("hash %.3f sec\n", (double)time_start / CLOCKS_PER_SEC);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -1067,7 +1070,7 @@ int create_recovery_file(
|
||||
#endif
|
||||
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
print_progress_text(0, "Constructing recovery file");
|
||||
time_last = GetTickCount();
|
||||
@@ -1260,8 +1263,8 @@ unsigned int time_start = GetTickCount();
|
||||
print_progress_done(); // 改行して行の先頭に戻しておく
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("write %d.%03d sec\n", time_start / 1000, time_start % 1000);
|
||||
time_start = clock() - time_start;
|
||||
printf("write %.3f sec\n", (double)time_start / CLOCKS_PER_SEC);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@@ -1282,6 +1285,7 @@ int create_recovery_file_1pass(
|
||||
int footer_size, // 末尾パケットのバッファー・サイズ
|
||||
HANDLE *rcv_hFile, // 各リカバリ・ファイルのハンドル
|
||||
unsigned char *p_buf, // 計算済みのパリティ・ブロック
|
||||
unsigned char *g_buf, // GPU用 (GPUを使わない場合は NULLにすること)
|
||||
unsigned int unit_size)
|
||||
{
|
||||
unsigned char *packet_header, hash[HASH_SIZE];
|
||||
@@ -1438,6 +1442,10 @@ int create_recovery_file_1pass(
|
||||
|
||||
// Recovery Slice packet は後から書き込む
|
||||
for (j = block_start; j < block_start + block_count; j++){
|
||||
if (g_buf != NULL){ // GPUを使った場合
|
||||
// CPUスレッドと GPUスレッドの計算結果を合わせる
|
||||
galois_align_xor(g_buf + (size_t)unit_size * j, p_buf, unit_size);
|
||||
}
|
||||
// パリティ・ブロックのチェックサムを検証する
|
||||
checksum16_return(p_buf, hash, unit_size - HASH_SIZE);
|
||||
if (memcmp(p_buf + unit_size - HASH_SIZE, hash, HASH_SIZE) != 0){
|
||||
@@ -1821,10 +1829,12 @@ int split_files(
|
||||
}
|
||||
if (ext_len > 0){ // 全て数字の拡張子を持つソース・ファイルがあるなら
|
||||
//printf_cp("\n risky name = %s \n", file_name);
|
||||
wcscpy(file_path, file_name); // 比較用に拡張子を取り除く
|
||||
file_path[name_len] = 0;
|
||||
for (num2 = 0; num2 < file_num; num2++){
|
||||
if (num2 == num)
|
||||
continue;
|
||||
if (_wcsnicmp(list_buf + files[num2].name, file_name, name_len) == 0){
|
||||
if (_wcsicmp(list_buf + files[num2].name, file_path) == 0){
|
||||
//printf_cp(" match name = %s \n", list_buf + files[num2].name);
|
||||
num8 = (files[num2].size + (__int64)split_size - 1) / split_size;
|
||||
split_max = (int)num8;
|
||||
@@ -1835,7 +1845,7 @@ int split_files(
|
||||
if (((split_max < 1000) && (ext_len >= 5)) || ((split_max < 10000) && (ext_len >= 6)))
|
||||
continue; // 拡張子の桁数が異なる
|
||||
// 上書きする危険性があるのでエラーにする
|
||||
printf_cp("split bad file, %s\n", file_name);
|
||||
printf_cp("split bad file, %s\n", list_buf + files[num2].name);
|
||||
*cur_num = -1;
|
||||
*cur_id = 0;
|
||||
return 1;
|
||||
|
||||
@@ -82,6 +82,7 @@ int create_recovery_file_1pass(
|
||||
int footer_size, // 末尾パケットのバッファー・サイズ
|
||||
HANDLE *rcv_hFile, // 各リカバリ・ファイルのハンドル
|
||||
unsigned char *p_buf, // 計算済みのパリティ・ブロック
|
||||
unsigned char *g_buf, // GPU用 (GPUを使わない場合は NULLにすること)
|
||||
unsigned int unit_size);
|
||||
|
||||
// 作成中のリカバリ・ファイルを削除する
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
extern unsigned short *galois_log_table;
|
||||
//extern unsigned short *galois_log_table;
|
||||
extern unsigned int cpu_flag;
|
||||
|
||||
int galois_create_table(void); // Returns 0 on success, -1 on failure
|
||||
@@ -47,6 +47,15 @@ typedef void (* REGION_MULTIPLY) (
|
||||
int factor); // Number to multiply by
|
||||
REGION_MULTIPLY galois_align_multiply;
|
||||
|
||||
typedef void (* REGION_MULTIPLY2) (
|
||||
unsigned char *src1, // Region to multiply
|
||||
unsigned char *src2,
|
||||
unsigned char *dst, // Products go here
|
||||
unsigned int len, // Byte length
|
||||
int factor1, // Number to multiply by
|
||||
int factor2);
|
||||
REGION_MULTIPLY2 galois_align_multiply2;
|
||||
|
||||
// 領域並び替え用の関数定義
|
||||
typedef void (* REGION_ALTMAP) (unsigned char *data, unsigned int bsize);
|
||||
REGION_ALTMAP galois_altmap_change;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// lib_opencl.c
|
||||
// Copyright : 2023-06-01 Yutaka Sawada
|
||||
// Copyright : 2024-01-21 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _WIN32_WINNT
|
||||
@@ -72,11 +72,10 @@ typedef cl_int (CL_API_CALL *API_clEnqueueNDRangeKernel)(cl_command_queue, cl_ke
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
// グローバル変数
|
||||
|
||||
extern unsigned int cpu_flag, cpu_cache; // declared in common2.h
|
||||
extern unsigned int cpu_flag; // declared in common2.h
|
||||
extern int cpu_num;
|
||||
|
||||
#define MAX_DEVICE 3
|
||||
#define MAX_GROUP_NUM 64
|
||||
#define MAX_DEVICE 8
|
||||
|
||||
HMODULE hLibOpenCL = NULL;
|
||||
|
||||
@@ -85,7 +84,7 @@ cl_command_queue OpenCL_command = NULL;
|
||||
cl_kernel OpenCL_kernel = NULL;
|
||||
cl_mem OpenCL_src = NULL, OpenCL_dst = NULL, OpenCL_buf = NULL;
|
||||
size_t OpenCL_group_num;
|
||||
int OpenCL_method = 0; // 正=速い機器を選ぶ, 負=遅い機器を選ぶ
|
||||
int OpenCL_method = 0; // 標準では GPU を使わず、動作は自動選択される
|
||||
|
||||
API_clCreateBuffer gfn_clCreateBuffer;
|
||||
API_clReleaseMemObject gfn_clReleaseMemObject;
|
||||
@@ -101,24 +100,27 @@ API_clEnqueueNDRangeKernel gfn_clEnqueueNDRangeKernel;
|
||||
|
||||
/*
|
||||
入力
|
||||
OpenCL_method : どのデバイスを選ぶか
|
||||
OpenCL_method : どのデバイスや関数を選ぶか
|
||||
0x100 = 速い機器を選ぶ, 0x200 = 遅い機器を選ぶ
|
||||
0x10000 = 1ブロックずつ計算する, 0x20000 = 2ブロックずつ計算しようとする
|
||||
0x40000 = 4-byte memory access, 0x80000 = try 16-byte memory access
|
||||
0x100000 = CL_MEM_COPY_HOST_PTR, 0x200000 = CL_MEM_USE_HOST_PTR
|
||||
unit_size : ブロックの単位サイズ
|
||||
src_max : ソース・ブロック個数
|
||||
chunk_size = 0: 標準では分割しない
|
||||
|
||||
出力
|
||||
return : エラー番号
|
||||
src_max : 最大で何ブロックまでソースを読み込めるか
|
||||
chunk_size : CPUスレッドの分割サイズ
|
||||
OpenCL_method : 動作フラグいろいろ
|
||||
*/
|
||||
|
||||
// 0=成功, 1~エラー番号
|
||||
int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
int init_OpenCL(unsigned int unit_size, int *src_max)
|
||||
{
|
||||
char buf[2048], *p_source;
|
||||
int err = 0, i, j;
|
||||
int gpu_power, count;
|
||||
int unified_memory; // non zero = Integrated GPU
|
||||
size_t data_size, alloc_max;
|
||||
//FILE *fp;
|
||||
HRSRC res;
|
||||
@@ -139,9 +141,10 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
API_clReleaseProgram fn_clReleaseProgram;
|
||||
API_clCreateKernel fn_clCreateKernel;
|
||||
API_clGetKernelWorkGroupInfo fn_clGetKernelWorkGroupInfo;
|
||||
API_clReleaseKernel fn_clReleaseKernel;
|
||||
cl_int ret;
|
||||
cl_uint num_platforms = 0, num_devices = 0, num_groups, param_value;
|
||||
cl_ulong param_value8, cache_size;
|
||||
cl_ulong param_value8;
|
||||
cl_platform_id platform_id[MAX_DEVICE], selected_platform; // Intel, AMD, Nvidia などドライバーの提供元
|
||||
cl_device_id device_id[MAX_DEVICE], selected_device; // CPU や GPU など
|
||||
cl_program program;
|
||||
@@ -218,6 +221,9 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
fn_clGetKernelWorkGroupInfo = (API_clGetKernelWorkGroupInfo)GetProcAddress(hLibOpenCL, "clGetKernelWorkGroupInfo");
|
||||
if (fn_clGetKernelWorkGroupInfo == NULL)
|
||||
return err;
|
||||
fn_clReleaseKernel = (API_clReleaseKernel)GetProcAddress(hLibOpenCL, "clReleaseKernel");
|
||||
if (fn_clReleaseKernel == NULL)
|
||||
return err;
|
||||
gfn_clFinish = (API_clFinish)GetProcAddress(hLibOpenCL, "clFinish");
|
||||
if (gfn_clFinish == NULL)
|
||||
return err;
|
||||
@@ -229,12 +235,12 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
ret = fn_clGetPlatformIDs(MAX_DEVICE, platform_id, &num_platforms);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 10;
|
||||
if (OpenCL_method >= 0){ // 選択する順序と初期値を変える
|
||||
OpenCL_method = 1;
|
||||
gpu_power = 0;
|
||||
} else {
|
||||
OpenCL_method = -1;
|
||||
if (num_platforms > MAX_DEVICE)
|
||||
num_platforms = MAX_DEVICE;
|
||||
if (OpenCL_method & 0x200){ // 選択する順序と初期値を変える
|
||||
gpu_power = INT_MIN;
|
||||
} else {
|
||||
gpu_power = 0;
|
||||
}
|
||||
alloc_max = 0;
|
||||
|
||||
@@ -250,6 +256,8 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
// 環境内の OpenCL 対応機器の数
|
||||
if (fn_clGetDeviceIDs(platform_id[i], CL_DEVICE_TYPE_GPU, MAX_DEVICE, device_id, &num_devices) != CL_SUCCESS)
|
||||
continue;
|
||||
if (num_devices > MAX_DEVICE)
|
||||
num_devices = MAX_DEVICE;
|
||||
|
||||
for (j = 0; j < (int)num_devices; j++){
|
||||
// デバイスが利用可能か確かめる
|
||||
@@ -268,61 +276,42 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_VERSION, sizeof(buf), buf, NULL);
|
||||
if (ret == CL_SUCCESS)
|
||||
printf("Device version = %s\n", buf);
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), ¶m_value8, NULL);
|
||||
if (ret == CL_SUCCESS)
|
||||
printf("LOCAL_MEM_SIZE = %I64d KB\n", param_value8 >> 10);
|
||||
|
||||
// 無理とは思うけど、一応チェックする
|
||||
//#define CL_DEVICE_SVM_CAPABILITIES 0x1053
|
||||
//#define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER (1 << 0)
|
||||
//#define CL_DEVICE_SVM_FINE_GRAIN_BUFFER (1 << 1)
|
||||
//#define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM (1 << 2)
|
||||
//#define CL_DEVICE_SVM_ATOMICS (1 << 3)
|
||||
// ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_SVM_CAPABILITIES, sizeof(cl_ulong), ¶m_value8, NULL);
|
||||
// if (ret == CL_INVALID_VALUE)
|
||||
// printf("Shared Virtual Memory is not supported\n");
|
||||
// if (ret == CL_SUCCESS)
|
||||
// printf("Shared Virtual Memory = 0x%I64X\n", param_value8);
|
||||
#endif
|
||||
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_ADDRESS_BITS, sizeof(cl_uint), ¶m_value, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
continue;
|
||||
// 取得できなくてもエラーにしない
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_HOST_UNIFIED_MEMORY, sizeof(cl_uint), ¶m_value, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
if (param_value != 0){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("HOST_UNIFIED_MEMORY = %d\n", param_value);
|
||||
#endif
|
||||
param_value = 1;
|
||||
}
|
||||
} else { // CL_DEVICE_HOST_UNIFIED_MEMORY は OpenCL 2.0 以降で非推奨になった
|
||||
param_value = 0;
|
||||
}
|
||||
|
||||
// 取得できない場合はエラーにする
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), ¶m_value8, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
continue;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("ADDRESS_BITS = %d\n", param_value);
|
||||
printf("MAX_MEM_ALLOC_SIZE = %I64d MB\n", param_value8 >> 20);
|
||||
#endif
|
||||
if (param_value == 32){ // CL_DEVICE_ADDRESS_BITS によって確保するメモリー領域の上限を変える
|
||||
if (param_value8 > 0x30000000) // 768MB までにする
|
||||
param_value8 = 0x30000000;
|
||||
} else { // 64-bit OS でも 2GB までにする
|
||||
if (param_value8 > 0x80000000)
|
||||
param_value8 = 0x80000000;
|
||||
}
|
||||
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &num_groups, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
continue;
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &data_size, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
continue;
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_HOST_UNIFIED_MEMORY, sizeof(cl_uint), ¶m_value, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
continue;
|
||||
if (param_value != 0)
|
||||
param_value = 1;
|
||||
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("MAX_COMPUTE_UNITS = %d\n", num_groups);
|
||||
printf("MAX_WORK_GROUP_SIZE = %zd\n", data_size);
|
||||
printf("HOST_UNIFIED_MEMORY = %d\n", param_value);
|
||||
#endif
|
||||
// MAX_COMPUTE_UNITS * MAX_WORK_GROUP_SIZE で計算力を測る、外付けGPUなら値を倍にする
|
||||
count = (2 - param_value) * (int)data_size * num_groups;
|
||||
count *= OpenCL_method; // 符号を変える
|
||||
if (OpenCL_method & 0x200) // Prefer slower device
|
||||
count *= -1; // 符号を変える
|
||||
//printf("prev = %d, now = %d\n", gpu_power, count);
|
||||
if ((count > gpu_power) && (data_size >= 256) && // 256以上ないとテーブルを作れない
|
||||
(param_value8 / 8 > (cl_ulong)unit_size)){ // CL_DEVICE_MAX_MEM_ALLOC_SIZE に収まるか
|
||||
@@ -330,41 +319,20 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
selected_device = device_id[j]; // 使うデバイスの ID
|
||||
selected_platform = platform_id[i];
|
||||
OpenCL_group_num = num_groups; // ワークグループ数は COMPUTE_UNITS 数にする
|
||||
if (OpenCL_group_num > MAX_GROUP_NUM) // 制限を付けてローカルメモリーの消費を抑える
|
||||
OpenCL_group_num = MAX_GROUP_NUM;
|
||||
alloc_max = (size_t)param_value8;
|
||||
unified_memory = param_value; // 0 = discrete GPU, 1 = integrated GPU
|
||||
|
||||
// AMD Radeon ではメモリー領域が全体の 1/4 とは限らない
|
||||
// AMD や Intel の GPU ではメモリー領域が全体の 1/4 とは限らない
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(cl_ulong), ¶m_value8, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("GLOBAL_MEM_SIZE = %I64d MB\n", param_value8 >> 20);
|
||||
#endif
|
||||
// 領域一個あたりのサイズは全体の 1/4 までにする
|
||||
// 領域一個あたりのサイズは全体の 1/4 までにする(VRAMを使いすぎると不安定になる)
|
||||
param_value8 /= 4;
|
||||
if ((cl_ulong)alloc_max > param_value8)
|
||||
alloc_max = (size_t)param_value8;
|
||||
}
|
||||
|
||||
cache_size = 0;
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, sizeof(cl_uint), &num_groups, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("GLOBAL_MEM_CACHE_TYPE = %d\n", num_groups);
|
||||
#endif
|
||||
if (num_groups & 3){ // CL_READ_ONLY_CACHE or CL_READ_WRITE_CACHE
|
||||
ret = fn_clGetDeviceInfo(device_id[j], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, sizeof(cl_ulong), &cache_size, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("GLOBAL_MEM_CACHE_SIZE = %I64d KB\n", cache_size >> 10);
|
||||
#endif
|
||||
if (param_value != 0){ // 内蔵 GPU なら CPU との共有キャッシュを活用する
|
||||
if (cache_size >= 1048576) // サイズが小さい場合は分割しない
|
||||
cache_size |= 0x40000000;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -394,70 +362,6 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 12;
|
||||
|
||||
// 計算方式を選択する
|
||||
gpu_power = unit_size; // unit_size は MEM_UNIT の倍数になってる
|
||||
if ((((cpu_flag & 0x101) == 1) || ((cpu_flag & 16) != 0)) && (sse_unit == 32)){
|
||||
OpenCL_method = 2; // SSSE3 & ALTMAP または AVX2 ならデータの並び替え対応版を使う
|
||||
if (cache_size & 0x40000000){ // 内蔵 GPU でキャッシュを利用できるなら、CPUスレッドと同じにする
|
||||
j = cpu_cache & 0x7FFF8000; // CPUのキャッシュ上限サイズ
|
||||
count = (int)(cache_size & 0x3FFFFFFF) / 4; // ただし、認識できるサイズの 1/4 までにする
|
||||
if ((j == 0) || (j > count))
|
||||
j = count;
|
||||
count = 1;
|
||||
while (gpu_power > j){ // 制限サイズより大きいなら
|
||||
// 分割数を増やして chunk のサイズを試算してみる
|
||||
count++;
|
||||
gpu_power = (unit_size + count - 1) / count;
|
||||
gpu_power = (gpu_power + (MEM_UNIT - 1)) & ~(MEM_UNIT - 1); // MEM_UNITの倍数にする
|
||||
}
|
||||
if (count > 1){
|
||||
*chunk_size = gpu_power;
|
||||
OpenCL_method = 3;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("gpu cache: limit size = %d, chunk size = %d, split = %d\n", j, gpu_power, count);
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
// 32バイト単位のメモリーアクセスならキャッシュする必要なし?計算速度が半減する・・・
|
||||
} else if ((cache_size & 0x3FFFFFFF) > OpenCL_group_num * 4096){ // 2KB の倍はいるかも?
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("gpu: cache size = %d, read size = %d\n", cache_size & 0x3FFFFFFF, OpenCL_group_num * 2048);
|
||||
#endif
|
||||
OpenCL_method = 1;
|
||||
*/
|
||||
}
|
||||
|
||||
} else if (((cpu_flag & 128) != 0) && (sse_unit == 256)){
|
||||
OpenCL_method = 4; // JIT(SSE2) は bit ごとに上位から 16バイトずつ並ぶ
|
||||
// ローカルのテーブルサイズが異なることに注意
|
||||
// XOR 方式以外は 2KB (4バイト * 256項目 * 2個) 使う
|
||||
// XOR (JIT) は 64バイト (4バイト * 16項目) 使う
|
||||
#ifdef DEBUG_OUTPUT
|
||||
// printf("4 KB cache (16-bytes * 256 work items), use if\n");
|
||||
#endif
|
||||
} else {
|
||||
OpenCL_method = 1; // MMX用のコードは遅いので、キャッシュ最適化する必要が無い
|
||||
}
|
||||
|
||||
// work group 数が必要以上に多い場合は減らす
|
||||
/*
|
||||
if (OpenCL_method == 4){
|
||||
// work item 一個が 16バイトずつ計算する、256個なら work group ごとに 4KB 担当する
|
||||
data_size = unit_size / 4096;
|
||||
} else
|
||||
*/
|
||||
if (OpenCL_method & 2){
|
||||
// work item 一個が 8バイトずつ計算する、256個なら work group ごとに 2KB 担当する
|
||||
data_size = unit_size / 2048;
|
||||
} else {
|
||||
// work item 一個が 4バイトずつ計算する、256個なら work group ごとに 1KB 担当する
|
||||
data_size = unit_size / 1024;
|
||||
}
|
||||
if (OpenCL_group_num > data_size){
|
||||
OpenCL_group_num = data_size;
|
||||
printf("Number of work groups is reduced to %d\n", (int)OpenCL_group_num);
|
||||
}
|
||||
|
||||
// 最大で何ブロック分のメモリー領域を保持できるのか(ここではまだ確保しない)
|
||||
// 後で実際に確保する量はこれよりも少なくなる
|
||||
count = (int)(alloc_max / unit_size); // 確保できるメモリー量から逆算する
|
||||
@@ -469,25 +373,6 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
printf("src buf : %zd KB (%d blocks), possible\n", data_size >> 10, count);
|
||||
#endif
|
||||
|
||||
// 出力先は1ブロック分だけあればいい
|
||||
// CL_MEM_ALLOC_HOST_PTRを使えばpinned memoryになるらしい
|
||||
data_size = unit_size;
|
||||
OpenCL_dst = gfn_clCreateBuffer(OpenCL_context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, data_size, NULL, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 13;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("dst buf : %zd KB (%zd Bytes), OK\n", data_size >> 10, data_size);
|
||||
#endif
|
||||
|
||||
// factor は最大個数分 (src_max個)
|
||||
data_size = sizeof(unsigned short) * (*src_max);
|
||||
OpenCL_buf = gfn_clCreateBuffer(OpenCL_context, CL_MEM_READ_ONLY, data_size, NULL, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 14;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("factor buf : %zd Bytes (%d factors), OK\n", data_size, (*src_max));
|
||||
#endif
|
||||
|
||||
/*
|
||||
// テキスト形式の OpenCL C ソース・コードを読み込む
|
||||
err = 4;
|
||||
@@ -574,7 +459,7 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
FreeResource(glob); // not required ?
|
||||
|
||||
// 定数を指定する
|
||||
wsprintfA(buf, "-D BLK_SIZE=%d -D CHK_SIZE=%d", unit_size / 4, gpu_power / 4);
|
||||
wsprintfA(buf, "-cl-fast-relaxed-math -D BLK_SIZE=%d", unit_size / 4);
|
||||
|
||||
// 使用する OpenCL デバイス用にコンパイルする
|
||||
ret = fn_clBuildProgram(program, 1, &selected_device, buf, NULL, NULL);
|
||||
@@ -588,18 +473,208 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
return (ret << 8) | 21;
|
||||
}
|
||||
|
||||
// カーネル関数を抽出する
|
||||
wsprintfA(buf, "method%d", OpenCL_method & 7);
|
||||
OpenCL_kernel = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 22;
|
||||
// 計算方式を選択する
|
||||
if ((((cpu_flag & 0x101) == 1) || ((cpu_flag & 0x110) == 0x10)) && (sse_unit == 32)){
|
||||
int select_method; // SSSE3 & ALTMAP または AVX2 ならデータの並び替え対応版を使う
|
||||
if (OpenCL_method & 0x80000){ // 16-byte and 2 blocks
|
||||
select_method = 12;
|
||||
} else if (OpenCL_method & 0x40000){ // 4-byte and 2 blocks
|
||||
select_method = 10;
|
||||
} else if (OpenCL_method & 0x20000){ // 16-byte
|
||||
select_method = 4;
|
||||
} else if (OpenCL_method & 0x10000){ // 4-byte
|
||||
select_method = 2;
|
||||
} else { // kernel を作って詳細を確かめる
|
||||
size_t item2, item4, item10, item12;
|
||||
cl_kernel kernel2, kernel4, kernel10, kernel12;
|
||||
item2 = item4 = item10 = item12 = 0;
|
||||
// まずは一番重くて速い奴を調べる
|
||||
wsprintfA(buf, "method%d", 12);
|
||||
kernel12 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel12, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item12, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("CreateKernel : %s\n", buf);
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item12);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item12 >= 32){ // 32以上あれば余裕で動くとみなす
|
||||
select_method = 12;
|
||||
OpenCL_kernel = kernel12;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else { // 他の奴と比較する
|
||||
wsprintfA(buf, "method%d", 2);
|
||||
kernel2 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel2, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item2, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item12 >= item2){
|
||||
select_method = 12;
|
||||
OpenCL_kernel = kernel12;
|
||||
ret = fn_clReleaseKernel(kernel2);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else {
|
||||
ret = fn_clReleaseKernel(kernel12);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
#endif
|
||||
wsprintfA(buf, "method%d", 10);
|
||||
kernel10 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel10, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item10, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item10);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item10 >= item2){
|
||||
select_method = 10;
|
||||
OpenCL_kernel = kernel10;
|
||||
ret = fn_clReleaseKernel(kernel2);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else {
|
||||
wsprintfA(buf, "method%d", 4);
|
||||
kernel4 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel4, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item4, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item4);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item4 >= item2){
|
||||
select_method = 4;
|
||||
OpenCL_kernel = kernel4;
|
||||
ret = fn_clReleaseKernel(kernel2);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else {
|
||||
select_method = 2;
|
||||
OpenCL_kernel = kernel2;
|
||||
ret = fn_clReleaseKernel(kernel4);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
OpenCL_method |= select_method;
|
||||
} else if (((cpu_flag & 128) != 0) && (sse_unit == 256)){
|
||||
OpenCL_method |= 16; // JIT(SSE2) は bit ごとに上位から 16バイトずつ並ぶ
|
||||
// ローカルのテーブルサイズが異なることに注意
|
||||
// XOR 方式以外は 2KB (4バイト * 256項目 * 2個) 使う
|
||||
// XOR (JIT) は 64バイト (4バイト * 16項目) 使う
|
||||
} else {
|
||||
int select_method; // 並び替えられてないデータ用
|
||||
if (OpenCL_method & 0x40000){ // 4-byte and 2 blocks
|
||||
select_method = 9;
|
||||
} else if (OpenCL_method & 0x10000){ // 4-byte
|
||||
select_method = 1;
|
||||
} else { // kernel を作って詳細を確かめる
|
||||
size_t item1, item9;
|
||||
cl_kernel kernel1, kernel9;
|
||||
item1 = item9 = 0;
|
||||
// まずは一番重くて速い奴を調べる
|
||||
wsprintfA(buf, "method%d", 9);
|
||||
kernel9 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel9, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item9, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item9);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item9 >= 32){ // 32以上あれば余裕で動くとみなす
|
||||
select_method = 9;
|
||||
OpenCL_kernel = kernel9;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else { // 他の奴と比較する
|
||||
wsprintfA(buf, "method%d", 1);
|
||||
kernel1 = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret == CL_SUCCESS){
|
||||
ret = fn_clGetKernelWorkGroupInfo(kernel1, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &item1, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("\nTesting %s\n", buf);
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", item1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (item9 >= item1){
|
||||
select_method = 9;
|
||||
OpenCL_kernel = kernel9;
|
||||
ret = fn_clReleaseKernel(kernel1);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
} else {
|
||||
select_method = 1;
|
||||
OpenCL_kernel = kernel1;
|
||||
ret = fn_clReleaseKernel(kernel9);
|
||||
#ifdef DEBUG_OUTPUT
|
||||
if (ret != CL_SUCCESS)
|
||||
printf("clReleaseKernel : Failed\n");
|
||||
printf("\nSelected method%d\n", select_method);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
OpenCL_method |= select_method;
|
||||
}
|
||||
|
||||
// カーネル関数を抽出する
|
||||
if (OpenCL_kernel == NULL){
|
||||
wsprintfA(buf, "method%d", OpenCL_method & 31);
|
||||
OpenCL_kernel = fn_clCreateKernel(program, buf, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 22;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("CreateKernel : %s\n", buf);
|
||||
ret = fn_clGetKernelWorkGroupInfo(OpenCL_kernel, selected_device, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), &data_size, NULL);
|
||||
if (ret == CL_SUCCESS)
|
||||
printf("PREFERRED_WORK_GROUP_SIZE_MULTIPLE = %zu\n", data_size);
|
||||
#endif
|
||||
}
|
||||
|
||||
// カーネルが実行できる work item 数を調べる
|
||||
ret = fn_clGetKernelWorkGroupInfo(OpenCL_kernel, NULL, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &data_size, NULL);
|
||||
if ((ret == CL_SUCCESS) && (data_size < 256)){ // 最低でも 256以上は必要
|
||||
ret = fn_clGetKernelWorkGroupInfo(OpenCL_kernel, selected_device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &data_size, NULL);
|
||||
if ((ret == CL_SUCCESS) && (data_size < 256)){ // 最低でも 256 以上は必要
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("KERNEL_WORK_GROUP_SIZE = %zd\n", data_size);
|
||||
#endif
|
||||
@@ -618,6 +693,60 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
fn_clUnloadCompiler();
|
||||
}
|
||||
|
||||
// work group 数が必要以上に多い場合は減らす
|
||||
if (OpenCL_method & 4){
|
||||
// work item 一個が 32バイトずつ計算する、256個なら work group ごとに 8KB 担当する
|
||||
data_size = unit_size / 8192;
|
||||
} else if (OpenCL_method & 2){
|
||||
// work item 一個が 8バイトずつ計算する、256個なら work group ごとに 2KB 担当する
|
||||
data_size = unit_size / 2048;
|
||||
} else {
|
||||
// work item 一個が 4バイトずつ計算する、256個なら work group ごとに 1KB 担当する
|
||||
data_size = unit_size / 1024;
|
||||
}
|
||||
if (OpenCL_group_num > data_size){
|
||||
OpenCL_group_num = data_size;
|
||||
printf("Number of work groups is reduced to %zd\n", OpenCL_group_num);
|
||||
}
|
||||
|
||||
// データへのアクセス方法をデバイスによって変える
|
||||
if (OpenCL_method & 0x200000){
|
||||
OpenCL_method |= 32;
|
||||
} else if ((OpenCL_method & 0x100000) == 0){
|
||||
if (unified_memory){
|
||||
OpenCL_method |= 32; // Integrated GPU なら CL_MEM_USE_HOST_PTR を使う
|
||||
} else { // Discrete GPU でも Nvidia のは動作を変える
|
||||
ret = fn_clGetDeviceInfo(selected_device, CL_DEVICE_VERSION, sizeof(buf), buf, NULL);
|
||||
if (ret == CL_SUCCESS){
|
||||
if (strstr(buf, "CUDA") != NULL)
|
||||
OpenCL_method |= 32; // NVIDIA GPU なら CL_MEM_USE_HOST_PTR を使う
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 出力先は1ブロック分だけあればいい
|
||||
// CL_MEM_ALLOC_HOST_PTRを使えばpinned memoryになるらしい
|
||||
data_size = unit_size;
|
||||
if (OpenCL_method & 8)
|
||||
data_size *= 2; // 2ブロックずつ計算できるように、2倍確保しておく
|
||||
OpenCL_dst = gfn_clCreateBuffer(OpenCL_context, CL_MEM_ALLOC_HOST_PTR, data_size, NULL, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 13;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("dst buf : %zd KB (%zd Bytes), OK\n", data_size >> 10, data_size);
|
||||
#endif
|
||||
|
||||
// factor は最大個数分 (src_max個)
|
||||
data_size = sizeof(unsigned short) * (*src_max);
|
||||
if (OpenCL_method & 8)
|
||||
data_size *= 2; // 2ブロックずつ計算できるように、2倍確保しておく
|
||||
OpenCL_buf = gfn_clCreateBuffer(OpenCL_context, CL_MEM_READ_ONLY, data_size, NULL, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 14;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
printf("factor buf : %zd Bytes (%d factors), OK\n", data_size, (*src_max));
|
||||
#endif
|
||||
|
||||
// カーネル引数を指定する
|
||||
ret = gfn_clSetKernelArg(OpenCL_kernel, 1, sizeof(cl_mem), &OpenCL_dst);
|
||||
if (ret != CL_SUCCESS)
|
||||
@@ -625,13 +754,12 @@ int init_OpenCL(int unit_size, int *src_max, int *chunk_size)
|
||||
ret = gfn_clSetKernelArg(OpenCL_kernel, 2, sizeof(cl_mem), &OpenCL_buf);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 102;
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 103;
|
||||
|
||||
#ifdef DEBUG_OUTPUT
|
||||
// ワークアイテム数
|
||||
printf("\nMax number of work items = %zd (256 * %zd)\n", OpenCL_group_num * 256, OpenCL_group_num);
|
||||
#endif
|
||||
OpenCL_method &= 0xFF; // 最後に選択設定を消去する
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -743,16 +871,24 @@ void info_OpenCL(char *buf, int buf_size)
|
||||
// ソース・ブロックをデバイス側にコピーする
|
||||
int gpu_copy_blocks(
|
||||
unsigned char *data, // ブロックのバッファー (境界は 4096にすること)
|
||||
int unit_size, // 4096の倍数にすること
|
||||
unsigned int unit_size, // 4096の倍数にすること
|
||||
int src_num) // 何ブロックをコピーするのか
|
||||
{
|
||||
size_t data_size;
|
||||
cl_int ret;
|
||||
cl_mem_flags flags;
|
||||
|
||||
// Integrated GPU と Discrete GPU の違いに関係なく、使う分だけ毎回メモリー領域を確保する
|
||||
data_size = (size_t)unit_size * src_num;
|
||||
// Intel GPUならZeroCopyできる、GeForce GPUでもメモリー消費量が少なくてコピーが速い
|
||||
OpenCL_src = gfn_clCreateBuffer(OpenCL_context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, data_size, data, &ret);
|
||||
if (OpenCL_method & 32){ // AMD's APU や Integrated GPU なら ZeroCopy する
|
||||
// 実際に比較してみると GeForce GPU でもメモリー消費量が少なくてコピーが速い
|
||||
// NVIDIA GPU は CL_MEM_USE_HOST_PTR でも VRAM 上にキャッシュするので速いらしい
|
||||
flags = CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR;
|
||||
} else { // Discrete GPU ならデータを VRAM にコピーする
|
||||
// AMD GPU は明示的にコピーするよう指定しないといけない
|
||||
flags = CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR;
|
||||
}
|
||||
OpenCL_src = gfn_clCreateBuffer(OpenCL_context, flags, data_size, data, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 1;
|
||||
#ifdef DEBUG_OUTPUT
|
||||
@@ -771,17 +907,31 @@ int gpu_copy_blocks(
|
||||
int gpu_multiply_blocks(
|
||||
int src_num, // Number of multiplying source blocks
|
||||
unsigned short *mat, // Matrix of numbers to multiply by
|
||||
unsigned short *mat2, // Set to calculate 2 blocks at once
|
||||
unsigned char *buf, // Products go here
|
||||
int len) // Byte length
|
||||
unsigned int len) // Byte length
|
||||
{
|
||||
unsigned __int64 *vram, *src, *dst;
|
||||
size_t global_size, local_size;
|
||||
cl_int ret;
|
||||
|
||||
// 倍率の配列をデバイス側に書き込む
|
||||
ret = gfn_clEnqueueWriteBuffer(OpenCL_command, OpenCL_buf, CL_FALSE, 0, sizeof(short) * src_num, mat, 0, NULL, NULL);
|
||||
if (mat2 == NULL){ // 1ブロック分だけコピーする
|
||||
ret = gfn_clEnqueueWriteBuffer(OpenCL_command, OpenCL_buf, CL_FALSE, 0, sizeof(short) * src_num, mat, 0, NULL, NULL);
|
||||
} else { // 2ブロックずつ計算する場合は、配列のサイズも2倍になる
|
||||
if ((size_t)mat2 == 1){ // アドレスが 1 になることはあり得ないので、識別できる
|
||||
ret = gfn_clEnqueueWriteBuffer(OpenCL_command, OpenCL_buf, CL_FALSE, 0, sizeof(short) * src_num * 2, mat, 0, NULL, NULL);
|
||||
} else { // 2回コピーする
|
||||
size_t data_size = sizeof(short) * src_num;
|
||||
ret = gfn_clEnqueueWriteBuffer(OpenCL_command, OpenCL_buf, CL_FALSE, 0, data_size, mat, 0, NULL, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 10;
|
||||
// もう一つの配列は違う場所からコピーする
|
||||
ret = gfn_clEnqueueWriteBuffer(OpenCL_command, OpenCL_buf, CL_FALSE, data_size, data_size, mat2, 0, NULL, NULL);
|
||||
}
|
||||
}
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 10;
|
||||
return (ret << 8) | 11;
|
||||
|
||||
// 引数を指定する
|
||||
ret = gfn_clSetKernelArg(OpenCL_kernel, 3, sizeof(int), &src_num);
|
||||
@@ -789,17 +939,17 @@ int gpu_multiply_blocks(
|
||||
return (ret << 8) | 103;
|
||||
|
||||
// カーネル並列実行
|
||||
local_size = 256; // テーブルやキャッシュのため、work item 数は 256に固定する
|
||||
local_size = 256; // テーブルやキャッシュのため、work item 数は 256 に固定する
|
||||
global_size = OpenCL_group_num * 256;
|
||||
//printf("group num = %d, global size = %d, local size = 256 \n", OpenCL_group_num, global_size);
|
||||
//printf("group num = %d, global size = %d, local size = %d \n", OpenCL_group_num, global_size, local_size);
|
||||
ret = gfn_clEnqueueNDRangeKernel(OpenCL_command, OpenCL_kernel, 1, NULL, &global_size, &local_size, 0, NULL, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 11;
|
||||
return (ret << 8) | 12;
|
||||
|
||||
// 出力内容をホスト側に反映させる
|
||||
vram = gfn_clEnqueueMapBuffer(OpenCL_command, OpenCL_dst, CL_TRUE, CL_MAP_READ, 0, len, 0, NULL, NULL, &ret);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 12;
|
||||
return (ret << 8) | 13;
|
||||
|
||||
// 8バイトごとに XOR する (SSE2 で XOR しても速くならず)
|
||||
src = vram;
|
||||
@@ -814,7 +964,7 @@ int gpu_multiply_blocks(
|
||||
// ホスト側でデータを変更しなくても、clEnqueueMapBufferと対で呼び出さないといけない
|
||||
ret = gfn_clEnqueueUnmapMemObject(OpenCL_command, OpenCL_dst, vram, 0, NULL, NULL);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 13;
|
||||
return (ret << 8) | 14;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -827,12 +977,12 @@ int gpu_finish(void)
|
||||
// 全ての処理が終わるのを待つ
|
||||
ret = gfn_clFinish(OpenCL_command);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 20;
|
||||
return (ret << 8) | 30;
|
||||
|
||||
if (OpenCL_src != NULL){ // 確保されてる場合は解除する
|
||||
ret = gfn_clReleaseMemObject(OpenCL_src);
|
||||
if (ret != CL_SUCCESS)
|
||||
return (ret << 8) | 21;
|
||||
return (ret << 8) | 31;
|
||||
OpenCL_src = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,20 +10,21 @@ extern "C" {
|
||||
|
||||
extern int OpenCL_method;
|
||||
|
||||
int init_OpenCL(int unit_size, int *src_max, int *chunk_size);
|
||||
int init_OpenCL(unsigned int unit_size, int *src_max);
|
||||
int free_OpenCL(void);
|
||||
void info_OpenCL(char *buf, int buf_size);
|
||||
|
||||
int gpu_copy_blocks(
|
||||
unsigned char *data,
|
||||
int unit_size,
|
||||
int src_end);
|
||||
unsigned int unit_size,
|
||||
int src_num);
|
||||
|
||||
int gpu_multiply_blocks(
|
||||
int src_num, // Number of multiplying source blocks
|
||||
unsigned short *mat, // Matrix of numbers to multiply by
|
||||
unsigned short *mat2, // Set to calculate 2 blocks at once
|
||||
unsigned char *buf, // Products go here
|
||||
int len); // Byte length
|
||||
unsigned int len); // Byte length
|
||||
|
||||
int gpu_finish(void);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// list.c
|
||||
// Copyright : 2022-10-14 Yutaka Sawada
|
||||
// Copyright : 2023-12-12 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -26,6 +26,11 @@
|
||||
|
||||
//#define TIMER // 実験用
|
||||
|
||||
#ifdef TIMER
|
||||
#include <time.h>
|
||||
static double time_sec, time_speed;
|
||||
#endif
|
||||
|
||||
// recovery set のファイルのハッシュ値を調べる (空のファイルは除く)
|
||||
// 0x00 = ファイルが存在して完全である
|
||||
// 0x01 = ファイルが存在しない
|
||||
@@ -296,7 +301,7 @@ int check_file_complete(
|
||||
{
|
||||
int i, rv;
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
|
||||
printf("\nVerifying Input File :\n");
|
||||
@@ -332,14 +337,14 @@ unsigned int time_start = GetTickCount();
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("\n hash %d.%03d sec", time_start / 1000, time_start % 1000);
|
||||
if (time_start > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_start * 131072));
|
||||
printf(", %d MB/s\n", time_start);
|
||||
time_start = clock() - time_start;
|
||||
time_sec = (double)time_start / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
printf("\n");
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("\n hash %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -348,7 +353,7 @@ if (time_start > 0){
|
||||
// SSD 上で複数ファイルを同時に検査する
|
||||
|
||||
// MAX_MULTI_READ の2倍ぐらいにする?
|
||||
#define MAX_READ_NUM 10
|
||||
#define MAX_READ_NUM 12
|
||||
|
||||
int check_file_complete_multi(
|
||||
char *ascii_buf,
|
||||
@@ -364,17 +369,15 @@ int check_file_complete_multi(
|
||||
HANDLE hSub[MAX_READ_NUM];
|
||||
FILE_CHECK_TH th[MAX_READ_NUM];
|
||||
#ifdef TIMER
|
||||
unsigned int time_start = GetTickCount();
|
||||
clock_t time_start = clock();
|
||||
#endif
|
||||
|
||||
memset(hSub, 0, sizeof(HANDLE) * MAX_READ_NUM);
|
||||
// Core数に応じてスレッド数を増やす
|
||||
if ((memory_use & 32) != 0){ // NVMe SSD
|
||||
if (cpu_num >= 8){ // 8 ~ 16 Cores
|
||||
multi_read = 4;
|
||||
} else { // 3 Cores + Hyper-threading, or 4 ~ 7 Cores
|
||||
multi_read = 3;
|
||||
}
|
||||
multi_read = (cpu_num + 2) / 3 + 1; // 3=2, 4~6=3, 7~9=4, 10~12=5, 13~=6
|
||||
if (multi_read > MAX_READ_NUM / 2)
|
||||
multi_read = MAX_READ_NUM / 2;
|
||||
} else { // SATA SSD
|
||||
multi_read = 2;
|
||||
}
|
||||
@@ -632,14 +635,14 @@ unsigned int time_start = GetTickCount();
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount() - time_start;
|
||||
printf("\n hash %d.%03d sec", time_start / 1000, time_start % 1000);
|
||||
if (time_start > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_start * 131072));
|
||||
printf(", %d MB/s\n", time_start);
|
||||
time_start = clock() - time_start;
|
||||
time_sec = (double)time_start / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
printf("\n");
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("\n hash %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
|
||||
error_end:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// md5_crc.c
|
||||
// Copyright : 2022-10-01 Yutaka Sawada
|
||||
// Copyright : 2023-12-12 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "phmd5.h"
|
||||
#include "md5_crc.h"
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
// バイト配列の MD5 ハッシュ値を求める
|
||||
@@ -200,10 +199,14 @@ int file_md5_crc32_block(
|
||||
//#define TIMER // 実験用
|
||||
|
||||
#ifdef TIMER
|
||||
static unsigned int time_start, time1_start;
|
||||
static unsigned int time_total = 0, time2_total = 0, time3_total = 0;
|
||||
#include <time.h>
|
||||
static double time_sec, time_speed;
|
||||
static clock_t time_start, time1_start;
|
||||
static clock_t time_total = 0, time2_total = 0, time3_total = 0;
|
||||
#endif
|
||||
|
||||
#define MAX_BUF_SIZE 2097152 // ヒープ領域を使う場合の最大サイズ
|
||||
|
||||
// ファイルのハッシュ値と各スライスのチェックサムを同時に計算する
|
||||
int file_hash_crc(
|
||||
wchar_t *file_name, // ハッシュ値を求めるファイル
|
||||
@@ -222,7 +225,7 @@ int file_hash_crc(
|
||||
HANDLE hFile;
|
||||
OVERLAPPED ol;
|
||||
#ifdef TIMER
|
||||
time1_start = GetTickCount();
|
||||
time1_start = clock();
|
||||
#endif
|
||||
|
||||
// ソース・ファイルを開く
|
||||
@@ -249,11 +252,11 @@ time1_start = GetTickCount();
|
||||
if (file_left < IO_SIZE)
|
||||
read_size = (unsigned int)file_left;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf1, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -279,11 +282,11 @@ time2_total += GetTickCount() - time_start;
|
||||
ol.OffsetHigh = (unsigned int)(file_off >> 32);
|
||||
file_off += IO_SIZE;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -299,7 +302,7 @@ time2_total += GetTickCount() - time_start;
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = 0; // チェックサム計算
|
||||
if (block_left > 0){ // 前回足りなかった分を追加する
|
||||
@@ -336,7 +339,7 @@ time_start = GetTickCount();
|
||||
}
|
||||
}
|
||||
#ifdef TIMER
|
||||
time3_total += GetTickCount() - time_start;
|
||||
time3_total += clock() - time_start;
|
||||
#endif
|
||||
|
||||
// 経過表示
|
||||
@@ -367,16 +370,17 @@ error_end:
|
||||
CloseHandle(ol.hEvent);
|
||||
|
||||
#ifdef TIMER
|
||||
time_total += GetTickCount() - time1_start;
|
||||
time_total += clock() - time1_start;
|
||||
if (*prog_now == total_file_size){
|
||||
printf("\nread %d.%03d sec\n", time2_total / 1000, time2_total % 1000);
|
||||
printf("main %d.%03d sec\n", time3_total / 1000, time3_total % 1000);
|
||||
if (time_total > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_total * 131072));
|
||||
printf("\nread %.3f sec\n", (double)time2_total / CLOCKS_PER_SEC);
|
||||
printf("main %.3f sec\n", (double)time3_total / CLOCKS_PER_SEC);
|
||||
time_sec = (double)time_total / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
time_start = 0;
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("total %d.%03d sec, %d MB/s\n", time_total / 1000, time_total % 1000, time_start);
|
||||
printf("total %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
}
|
||||
#endif
|
||||
return err;
|
||||
@@ -401,7 +405,7 @@ int file_hash_crc(
|
||||
HANDLE hFile;
|
||||
OVERLAPPED ol;
|
||||
#ifdef TIMER
|
||||
time1_start = GetTickCount();
|
||||
time1_start = clock();
|
||||
#endif
|
||||
|
||||
// ソース・ファイルを開く
|
||||
@@ -440,11 +444,11 @@ error_retry_read:
|
||||
if (file_left < IO_SIZE)
|
||||
read_size = (unsigned int)file_left;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf1, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -534,11 +538,11 @@ error_retry_pause:
|
||||
ol.OffsetHigh = (unsigned int)(file_off >> 32);
|
||||
file_off += IO_SIZE;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -555,7 +559,7 @@ time2_total += GetTickCount() - time_start;
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = 0; // チェックサム計算
|
||||
if (block_left > 0){ // 前回足りなかった分を追加する
|
||||
@@ -592,7 +596,7 @@ time_start = GetTickCount();
|
||||
}
|
||||
}
|
||||
#ifdef TIMER
|
||||
time3_total += GetTickCount() - time_start;
|
||||
time3_total += clock() - time_start;
|
||||
#endif
|
||||
|
||||
// 経過表示
|
||||
@@ -623,16 +627,17 @@ error_end:
|
||||
CloseHandle(ol.hEvent);
|
||||
|
||||
#ifdef TIMER
|
||||
time_total += GetTickCount() - time1_start;
|
||||
time_total += clock() - time1_start;
|
||||
if (*prog_now == total_file_size){
|
||||
printf("\nread %d.%03d sec\n", time2_total / 1000, time2_total % 1000);
|
||||
printf("main %d.%03d sec\n", time3_total / 1000, time3_total % 1000);
|
||||
if (time_total > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_total * 131072));
|
||||
printf("\nread %.3f sec\n", (double)time2_total / CLOCKS_PER_SEC);
|
||||
printf("main %.3f sec\n", (double)time3_total / CLOCKS_PER_SEC);
|
||||
time_sec = (double)time_total / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
time_start = 0;
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("total %d.%03d sec, %d MB/s\n", time_total / 1000, time_total % 1000, time_start);
|
||||
printf("total %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
}
|
||||
#endif
|
||||
return err;
|
||||
@@ -658,7 +663,7 @@ int file_hash_crc(
|
||||
HANDLE hFile;
|
||||
OVERLAPPED ol;
|
||||
#ifdef TIMER
|
||||
time1_start = GetTickCount();
|
||||
time1_start = clock();
|
||||
#endif
|
||||
|
||||
// ソース・ファイルを開く
|
||||
@@ -671,8 +676,8 @@ time1_start = GetTickCount();
|
||||
}
|
||||
|
||||
// バッファー・サイズが大きいのでヒープ領域を使う
|
||||
for (io_size = IO_SIZE; io_size < 1048576; io_size += IO_SIZE){ // 1 MB までにする
|
||||
if ((io_size + IO_SIZE > (cpu_cache << 17)) || ((__int64)(io_size + IO_SIZE) * 4 > file_left))
|
||||
for (io_size = IO_SIZE; io_size <= MAX_BUF_SIZE; io_size += IO_SIZE){ // IO_SIZE の倍数にする
|
||||
if ((io_size + IO_SIZE > (cpu_cache & 0xFFFE0000)) || ((__int64)(io_size + IO_SIZE) * 4 > file_left))
|
||||
break;
|
||||
}
|
||||
buf1 = _aligned_malloc(io_size * 2, 64);
|
||||
@@ -697,11 +702,11 @@ time1_start = GetTickCount();
|
||||
if (file_left < io_size)
|
||||
read_size = (unsigned int)file_left;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf1, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -727,11 +732,11 @@ time2_total += GetTickCount() - time_start;
|
||||
ol.OffsetHigh = (unsigned int)(file_off >> 32);
|
||||
file_off += io_size;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -747,7 +752,7 @@ time2_total += GetTickCount() - time_start;
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = 0; // チェックサム計算
|
||||
if (block_left > 0){ // 前回足りなかった分を追加する
|
||||
@@ -784,7 +789,7 @@ time_start = GetTickCount();
|
||||
}
|
||||
}
|
||||
#ifdef TIMER
|
||||
time3_total += GetTickCount() - time_start;
|
||||
time3_total += clock() - time_start;
|
||||
#endif
|
||||
|
||||
// 経過表示
|
||||
@@ -817,16 +822,17 @@ error_end:
|
||||
_aligned_free(buf1);
|
||||
|
||||
#ifdef TIMER
|
||||
time_total += GetTickCount() - time1_start;
|
||||
time_total += clock() - time1_start;
|
||||
if (*prog_now == total_file_size){
|
||||
printf("\nread %d.%03d sec\n", time2_total / 1000, time2_total % 1000);
|
||||
printf("main %d.%03d sec\n", time3_total / 1000, time3_total % 1000);
|
||||
if (time_total > 0){
|
||||
time_start = (int)((total_file_size * 125) / ((__int64)time_total * 131072));
|
||||
printf("\nread %.3f sec\n", (double)time2_total / CLOCKS_PER_SEC);
|
||||
printf("main %.3f sec\n", (double)time3_total / CLOCKS_PER_SEC);
|
||||
time_sec = (double)time_total / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)total_file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
time_start = 0;
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("total %d.%03d sec, %d MB/s\n", time_total / 1000, time_total % 1000, time_start);
|
||||
printf("total %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
}
|
||||
#endif
|
||||
return err;
|
||||
@@ -866,8 +872,8 @@ DWORD WINAPI file_hash_crc2(LPVOID lpParameter)
|
||||
|
||||
// バッファー・サイズが大きいのでヒープ領域を使う
|
||||
prog_tick = 1;
|
||||
for (io_size = IO_SIZE; io_size < 1048576; io_size += IO_SIZE){ // IO_SIZE の倍数で 1 MB までにする
|
||||
if ((io_size + IO_SIZE > (cpu_cache << 17)) || ((__int64)(io_size + IO_SIZE) * 4 > file_left))
|
||||
for (io_size = IO_SIZE; io_size <= MAX_BUF_SIZE; io_size += IO_SIZE){ // IO_SIZE の倍数にする
|
||||
if ((io_size + IO_SIZE > (cpu_cache & 0xFFFE0000)) || ((__int64)(io_size + IO_SIZE) * 4 > file_left))
|
||||
break;
|
||||
prog_tick++;
|
||||
}
|
||||
@@ -1036,7 +1042,7 @@ int file_hash_check(
|
||||
PHMD5 hash_ctx, block_ctx;
|
||||
OVERLAPPED ol;
|
||||
#ifdef TIMER
|
||||
time1_start = GetTickCount();
|
||||
time1_start = clock();
|
||||
#endif
|
||||
|
||||
prog_last = -1; // 検証中のファイル名を毎回表示する
|
||||
@@ -1060,11 +1066,11 @@ time1_start = GetTickCount();
|
||||
file_left = file_size - 16384; // 本来のファイル・サイズまでしか検査しない
|
||||
}
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, len, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -1139,11 +1145,11 @@ time2_total += GetTickCount() - time_start;
|
||||
if (file_left < IO_SIZE)
|
||||
read_size = (unsigned int)file_left;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf1, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -1166,11 +1172,11 @@ time2_total += GetTickCount() - time_start;
|
||||
ol.OffsetHigh = (unsigned int)(file_off >> 32);
|
||||
file_off += IO_SIZE;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -1185,7 +1191,7 @@ time2_total += GetTickCount() - time_start;
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
if (s_blk != NULL){
|
||||
off = 0;
|
||||
@@ -1228,7 +1234,7 @@ time_start = GetTickCount();
|
||||
Phmd5Process(&hash_ctx, buf, len); // MD5 計算
|
||||
}
|
||||
#ifdef TIMER
|
||||
time3_total += GetTickCount() - time_start;
|
||||
time3_total += clock() - time_start;
|
||||
#endif
|
||||
|
||||
// 経過表示
|
||||
@@ -1265,15 +1271,16 @@ error_end:
|
||||
CloseHandle(ol.hEvent);
|
||||
|
||||
#ifdef TIMER
|
||||
time_total += GetTickCount() - time1_start;
|
||||
printf("\nread %d.%03d sec\n", time2_total / 1000, time2_total % 1000);
|
||||
printf("main %d.%03d sec\n", time3_total / 1000, time3_total % 1000);
|
||||
if (time_total > 0){
|
||||
time_start = (int)((file_size * 125) / ((__int64)time_total * 131072));
|
||||
time_total += clock() - time1_start;
|
||||
printf("\nread %.3f sec\n", (double)time2_total / CLOCKS_PER_SEC);
|
||||
printf("main %.3f sec\n", (double)time3_total / CLOCKS_PER_SEC);
|
||||
time_sec = (double)time_total / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
time_start = 0;
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("total %d.%03d sec, %d MB/s\n", time_total / 1000, time_total % 1000, time_start);
|
||||
printf("total %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
return comp_num;
|
||||
}
|
||||
@@ -1303,8 +1310,8 @@ DWORD WINAPI file_hash_background(LPVOID lpParameter)
|
||||
find_next = files[num].b_off; // 先頭ブロックの番号
|
||||
|
||||
// バッファー・サイズが大きいのでヒープ領域を使う
|
||||
for (io_size = IO_SIZE; io_size < 1048576; io_size += IO_SIZE){ // IO_SIZE の倍数で 1 MB までにする
|
||||
if ((io_size + IO_SIZE > (cpu_cache << 17)) || ((__int64)(io_size + IO_SIZE) * 4 > file_size))
|
||||
for (io_size = IO_SIZE; io_size <= MAX_BUF_SIZE; io_size += IO_SIZE){ // IO_SIZE の倍数にする
|
||||
if ((io_size + IO_SIZE > (cpu_cache & 0xFFFE0000)) || ((__int64)(io_size + IO_SIZE) * 4 > file_size))
|
||||
break;
|
||||
}
|
||||
//printf("\n io_size = %d\n", io_size);
|
||||
@@ -1534,7 +1541,7 @@ int file_hash_direct(
|
||||
HANDLE hFile;
|
||||
OVERLAPPED ol;
|
||||
#ifdef TIMER
|
||||
time1_start = GetTickCount();
|
||||
time1_start = clock();
|
||||
#endif
|
||||
|
||||
prog_last = -1; // 検証中のファイル名を毎回表示する
|
||||
@@ -1590,11 +1597,11 @@ time1_start = GetTickCount();
|
||||
file_left = file_size - 16384; // 本来のファイル・サイズまでしか検査しない
|
||||
}
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
comp_num = -1;
|
||||
@@ -1677,11 +1684,11 @@ time2_total += GetTickCount() - time_start;
|
||||
read_size = (read_size + 4095) & ~4095; // 4KB の倍数にする
|
||||
}
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf1, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -1708,11 +1715,11 @@ time2_total += GetTickCount() - time_start;
|
||||
ol.OffsetHigh = (unsigned int)(file_off >> 32);
|
||||
file_off += IO_SIZE;
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
off = ReadFile(hFile, buf, read_size, NULL, &ol);
|
||||
#ifdef TIMER
|
||||
time2_total += GetTickCount() - time_start;
|
||||
time2_total += clock() - time_start;
|
||||
#endif
|
||||
if ((off == 0) && (GetLastError() != ERROR_IO_PENDING)){
|
||||
print_win32_err();
|
||||
@@ -1727,7 +1734,7 @@ time2_total += GetTickCount() - time_start;
|
||||
}
|
||||
|
||||
#ifdef TIMER
|
||||
time_start = GetTickCount();
|
||||
time_start = clock();
|
||||
#endif
|
||||
if (s_blk != NULL){
|
||||
off = 0;
|
||||
@@ -1769,7 +1776,7 @@ time_start = GetTickCount();
|
||||
Phmd5Process(&hash_ctx, buf, len); // MD5 計算
|
||||
}
|
||||
#ifdef TIMER
|
||||
time3_total += GetTickCount() - time_start;
|
||||
time3_total += clock() - time_start;
|
||||
#endif
|
||||
|
||||
// 経過表示
|
||||
@@ -1810,10 +1817,16 @@ error_end:
|
||||
_aligned_free(buf1);
|
||||
|
||||
#ifdef TIMER
|
||||
time_total += GetTickCount() - time1_start;
|
||||
printf("\nread %d.%03d sec\n", time2_total / 1000, time2_total % 1000);
|
||||
printf("main %d.%03d sec\n", time3_total / 1000, time3_total % 1000);
|
||||
printf("total %d.%03d sec\n", time_total / 1000, time_total % 1000);
|
||||
time_total += clock() - time1_start;
|
||||
printf("\nread %.3f sec\n", (double)time2_total / CLOCKS_PER_SEC);
|
||||
printf("main %.3f sec\n", (double)time3_total / CLOCKS_PER_SEC);
|
||||
time_sec = (double)time_total / CLOCKS_PER_SEC;
|
||||
if (time_sec > 0){
|
||||
time_speed = (double)file_size / (time_sec * 1048576);
|
||||
} else {
|
||||
time_speed = 0;
|
||||
}
|
||||
printf("total %.3f sec, %.0f MB/s\n", time_sec, time_speed);
|
||||
#endif
|
||||
return comp_num;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// par2.c
|
||||
// Copyright : 2023-03-15 Yutaka Sawada
|
||||
// Copyright : 2023-10-15 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -112,12 +112,12 @@ int par2_create(
|
||||
err = -12;
|
||||
} else {
|
||||
// メモリーを確保できるか試す
|
||||
err = read_block_num(parity_num, cpu_num - 1, 0, 256);
|
||||
err = read_block_num(parity_num, 0, 256);
|
||||
if (err == 0)
|
||||
err = -13;
|
||||
}
|
||||
#ifdef TIMER
|
||||
printf("read_block_num = %d\n", read_block_num(parity_num, cpu_num - 1, 0, 256));
|
||||
printf("read_block_num = %d\n", read_block_num(parity_num, 0, 256));
|
||||
#endif
|
||||
if (err > 0){ // 1-pass方式が可能
|
||||
#ifdef TIMER
|
||||
@@ -181,7 +181,7 @@ int par2_create(
|
||||
}
|
||||
} else {
|
||||
// 共通パケットを作成する
|
||||
if ((memory_use & 16) && (cpu_num >= 4) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
if ((memory_use & 16) && (cpu_num >= 3) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
common_size = set_common_packet_multi(common_buf, &packet_num, (switch_p & 2) >> 1, files);
|
||||
} else {
|
||||
common_size = set_common_packet(common_buf, &packet_num, (switch_p & 2) >> 1, files);
|
||||
@@ -529,7 +529,7 @@ int par2_verify(
|
||||
|
||||
// ソース・ファイルが完全かどうかを調べる
|
||||
// ファイルの状態は 完全、消失、追加、破損(完全なブロックの数) の4種類
|
||||
if ((memory_use & 16) && (cpu_num >= 4) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
if ((memory_use & 16) && (cpu_num >= 3) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
err = check_file_complete_multi(ascii_buf, uni_buf, files, s_blk);
|
||||
} else {
|
||||
err = check_file_complete(ascii_buf, uni_buf, files, s_blk);
|
||||
@@ -741,7 +741,7 @@ int par2_repair(
|
||||
|
||||
// ソース・ファイルが完全かどうかを一覧表示する
|
||||
// ファイルの状態は 完全、消失、追加、破損(完全なブロックの数) の4種類
|
||||
if ((memory_use & 16) && (cpu_num >= 4) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
if ((memory_use & 16) && (cpu_num >= 3) && (entity_num >= 2)){ // SSDなら複数ファイルを同時に処理する
|
||||
err = check_file_complete_multi(ascii_buf, uni_buf, files, s_blk);
|
||||
} else {
|
||||
err = check_file_complete(ascii_buf, uni_buf, files, s_blk);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// par2_cmd.c
|
||||
// Copyright : 2023-03-18 Yutaka Sawada
|
||||
// Copyright : 2023-12-09 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -86,36 +86,38 @@ static void print_environment(void)
|
||||
|
||||
printf("CPU thread\t: %d / %d\n", cpu_num & 0xFFFF, cpu_num >> 24);
|
||||
cpu_num &= 0xFFFF; // 利用するコア数だけにしておく
|
||||
printf("CPU cache limit : %d KB, %d KB\n", (cpu_cache & 0x7FFF8000) >> 10, (cpu_cache & 0x00007FFF) << 7);
|
||||
#ifndef _WIN64 // 32-bit 版は MMX, SSE2, SSSE3 のどれかを表示する
|
||||
printf("CPU cache limit : %d KB, %d KB\n", (cpu_flag & 0xFFFF0000) >> 10, (cpu_cache & 0xFFFE0000) >> 10);
|
||||
#ifndef _WIN64 // 32-bit 版は MMX, SSE2, SSSE3, AVX2 のどれかを表示する
|
||||
printf("CPU extra\t:");
|
||||
if (cpu_flag & 1){
|
||||
if (((cpu_flag & 16) != 0) && ((cpu_flag & 256) == 0)){
|
||||
printf(" AVX2");
|
||||
} else if (cpu_flag & 1){
|
||||
if (cpu_flag & 256){
|
||||
printf(" SSSE3(old)");
|
||||
printf(" SSSE3(slow)");
|
||||
} else {
|
||||
printf(" SSSE3");
|
||||
}
|
||||
} else if (cpu_flag & 128){
|
||||
} else if (((cpu_flag & 128) != 0) && ((cpu_flag & 256) == 0)){
|
||||
printf(" SSE2");
|
||||
} else {
|
||||
printf(" MMX");
|
||||
}
|
||||
#else // 64-bit 版は SSE2, SSSE3 を表示する
|
||||
#else // 64-bit 版は SSE2, SSSE3, AVX2 を表示する
|
||||
printf("CPU extra\t: x64");
|
||||
if (cpu_flag & 1){
|
||||
if (((cpu_flag & 16) != 0) && ((cpu_flag & 256) == 0)){
|
||||
printf(" AVX2");
|
||||
} else if (cpu_flag & 1){
|
||||
if (cpu_flag & 256){
|
||||
printf(" SSSE3(old)");
|
||||
printf(" SSSE3(slow)");
|
||||
} else {
|
||||
printf(" SSSE3");
|
||||
}
|
||||
} else if (cpu_flag & 128){
|
||||
} else if (((cpu_flag & 128) != 0) && ((cpu_flag & 256) == 0)){
|
||||
printf(" SSE2");
|
||||
}
|
||||
#endif
|
||||
if (cpu_flag & 8)
|
||||
printf(" CLMUL");
|
||||
if (cpu_flag & 16)
|
||||
printf(" AVX2");
|
||||
printf("\nMemory usage\t: ");
|
||||
if (memory_use & 7){
|
||||
printf("%d/8", memory_use & 7);
|
||||
@@ -1477,43 +1479,44 @@ ri= switch_set & 0x00040000
|
||||
} else if (wcsncmp(tmp_p, L"lc", 2) == 0){
|
||||
k = 0;
|
||||
j = 2;
|
||||
while ((j < 2 + 5) && (tmp_p[j] >= '0') && (tmp_p[j] <= '9')){
|
||||
while ((j < 2 + 7) && (tmp_p[j] >= '0') && (tmp_p[j] <= '9')){
|
||||
k = (k * 10) + (tmp_p[j] - '0');
|
||||
j++;
|
||||
}
|
||||
if (k & 32){ // GPU を使う
|
||||
OpenCL_method = 1; // Faster GPU
|
||||
} else if (k & 64){
|
||||
OpenCL_method = -1; // Slower GPU
|
||||
if (k & 0x300){ // GPU を使う
|
||||
OpenCL_method = k & 0x003F0300;
|
||||
}
|
||||
if (k & 16) // SSSE3 を使わない
|
||||
cpu_flag &= 0xFFFFFFFE;
|
||||
if (k & 128) // CLMUL を使わない、SSSE3 の古いエンコーダーを使う
|
||||
cpu_flag = (cpu_flag & 0xFFFFFFF7) | 0x100;
|
||||
if (k & 256) // JIT(SSE2) を使わない
|
||||
if (k & 1024) // CLMUL と ALTMAP を使わない
|
||||
cpu_flag = (cpu_flag & 0xFFFFFFF7) | 256;
|
||||
if (k & 2048) // JIT(SSE2) を使わない
|
||||
cpu_flag &= 0xFFFFFF7F;
|
||||
if (k & 512) // AVX2 を使わない
|
||||
if (k & 4096) // SSSE3 を使わない
|
||||
cpu_flag &= 0xFFFFFFFE;
|
||||
if (k & 8192) // AVX2 を使わない
|
||||
cpu_flag &= 0xFFFFFFEF;
|
||||
if (k & 15){ // 使用するコア数を変更する
|
||||
k &= 15; // 1~15 の範囲
|
||||
if (k & 255){ // 使用するコア数を変更する
|
||||
k &= 255; // 1~255 の範囲
|
||||
// printf("\n lc# = %d , logical = %d, physical = %d \n", k, cpu_num >> 24, (cpu_num & 0x00FF0000) >> 16);
|
||||
if (k == 12){ // 物理コア数の 1/4 にする
|
||||
if (k == 251){ // 物理コア数の 1/4 にする
|
||||
k = ((cpu_num & 0x00FF0000) >> 16) / 4;
|
||||
} else if (k == 13){ // 物理コア数の半分にする
|
||||
} else if (k == 252){ // 物理コア数の半分にする
|
||||
k = ((cpu_num & 0x00FF0000) >> 16) / 2;
|
||||
} else if (k == 14){ // 物理コア数の 3/4 にする
|
||||
} else if (k == 253){ // 物理コア数の 3/4 にする
|
||||
k = (((cpu_num & 0x00FF0000) >> 16) * 3) / 4;
|
||||
} else if (k == 15){ // 物理コア数にする
|
||||
k = (cpu_num & 0x00FF0000) >> 16;
|
||||
if (k >= 6)
|
||||
k--; // 物理コア数が 6以上なら、1個減らす
|
||||
} else if (k > (cpu_num >> 24)){
|
||||
k = cpu_num >> 24; // 論理コア数を超えないようにする
|
||||
} else if (k == 254){ // 物理コア数より減らす
|
||||
k = ((cpu_num & 0x00FF0000) >> 16) - 1;
|
||||
} else if (k == 255){ // 物理コア数より増やす
|
||||
k = cpu_num >> 16;
|
||||
k = ((k & 0xFF) + (k >> 8)) / 2; // 物理コア数と論理コア数の中間にする?
|
||||
// タスクマネージャーにおける CPU使用率は 100%になるけど、速くはならない・・・
|
||||
// k = (k & 0xFF) + ((k >> 8) - (k & 0xFF)) / 4; // 物理コア数の 5/4 にする?
|
||||
}
|
||||
if (k > MAX_CPU){
|
||||
k = MAX_CPU;
|
||||
} else if (k < 1){
|
||||
k = 1;
|
||||
} else if (k > (cpu_num >> 24)){
|
||||
k = cpu_num >> 24; // 論理コア数を超えないようにする
|
||||
}
|
||||
cpu_num = (cpu_num & 0xFFFF0000) | k; // 指定されたコア数を下位に配置する
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// reedsolomon.c
|
||||
// Copyright : 2023-05-29 Yutaka Sawada
|
||||
// Copyright : 2023-12-12 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -27,16 +27,19 @@
|
||||
#include "rs_decode.h"
|
||||
#include "reedsolomon.h"
|
||||
|
||||
#ifdef TIMER
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
// GPU を使う最小データサイズ (MB 単位)
|
||||
// GPU の起動には時間がかかるので、データが小さすぎると逆に遅くなる
|
||||
#define GPU_DATA_LIMIT 512
|
||||
#define GPU_DATA_LIMIT 200
|
||||
|
||||
// GPU を使う最小ブロックサイズとブロック数
|
||||
// CPU と GPU で処理を割り振る為には、ある程度のブロック数を必要とする
|
||||
#define GPU_BLOCK_SIZE_LIMIT 65536
|
||||
#define GPU_SOURCE_COUNT_LIMIT 256
|
||||
#define GPU_PARITY_COUNT_LIMIT 32
|
||||
#define GPU_SOURCE_COUNT_LIMIT 192
|
||||
#define GPU_PARITY_COUNT_LIMIT 8
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
@@ -46,7 +49,7 @@ int try_cache_blocking(int unit_size)
|
||||
int limit_size, chunk_count, chunk_size, cache_line_diff;
|
||||
|
||||
// CPUキャッシュをどのくらいまで使うか
|
||||
limit_size = cpu_flag & 0x7FFF8000; // 最低でも 32KB になる
|
||||
limit_size = cpu_flag & 0x7FFF0000; // 最低でも 64KB になる
|
||||
if (limit_size == 0) // キャッシュ・サイズを取得できなかった場合は最適化しない
|
||||
return unit_size;
|
||||
|
||||
@@ -160,7 +163,6 @@ unsigned int get_io_size(
|
||||
// 何ブロックまとめてファイルから読み込むかを空きメモリー量から計算する
|
||||
int read_block_num(
|
||||
int keep_num, // 保持するパリティ・ブロック数
|
||||
int add_num, // 余裕を見るブロック数
|
||||
size_t trial_alloc, // 確保できるか確認するのか
|
||||
int alloc_unit) // メモリー単位の境界 (sse_unit か MEM_UNIT)
|
||||
{
|
||||
@@ -177,7 +179,7 @@ int read_block_num(
|
||||
|
||||
if (trial_alloc){
|
||||
__int64 possible_size;
|
||||
possible_size = (__int64)unit_size * (source_num + keep_num + add_num);
|
||||
possible_size = (__int64)unit_size * (source_num + keep_num);
|
||||
#ifndef _WIN64 // 32-bit 版なら
|
||||
if (possible_size > MAX_MEM_SIZE) // 確保する最大サイズを 2GB までにする
|
||||
possible_size = MAX_MEM_SIZE;
|
||||
@@ -191,13 +193,13 @@ int read_block_num(
|
||||
}
|
||||
mem_size = get_mem_size(trial_alloc) / unit_size; // 何個分確保できるか
|
||||
|
||||
if (mem_size >= (size_t)(source_num + keep_num + add_num)){ // 最大個数より多い
|
||||
if (mem_size >= (size_t)(source_num + keep_num)){ // 最大個数より多い
|
||||
buf_num = source_num;
|
||||
} else if ((int)mem_size < read_min + keep_num + add_num){ // 少なすぎる
|
||||
} else if ((int)mem_size < read_min + keep_num){ // 少なすぎる
|
||||
buf_num = 0; // メモリー不足の印
|
||||
} else { // ソース・ブロック個数を等分割する
|
||||
int split_num;
|
||||
buf_num = (int)mem_size - (keep_num + add_num);
|
||||
buf_num = (int)mem_size - keep_num;
|
||||
split_num = (source_num + buf_num - 1) / buf_num; // 何回に別けて読み込むか
|
||||
buf_num = (source_num + split_num - 1) / split_num;
|
||||
}
|
||||
@@ -205,6 +207,48 @@ int read_block_num(
|
||||
return buf_num;
|
||||
}
|
||||
|
||||
// 1st encode, decode を何スレッドで実行するか決める
|
||||
int calc_thread_num1(int max_num)
|
||||
{
|
||||
int i, num;
|
||||
|
||||
// 読み込み中はスレッド数を減らす(シングル・スレッドの時は 0にする)
|
||||
num = 0;
|
||||
i = 1;
|
||||
while (i * 2 <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5
|
||||
num++;
|
||||
i *= 2;
|
||||
}
|
||||
if (num > max_num)
|
||||
num = max_num;
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
// 1st & 2nd encode, decode を何スレッドで実行するか決める
|
||||
int calc_thread_num2(int max_num, int *cpu_num2)
|
||||
{
|
||||
int i, num1, num2;
|
||||
|
||||
// 読み込み中はスレッド数を減らす(シングル・スレッドの時は 0にする)
|
||||
num1 = 0;
|
||||
i = 2;
|
||||
while (i <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5
|
||||
num1++;
|
||||
i *= 2;
|
||||
}
|
||||
if (num1 > max_num)
|
||||
num1 = max_num;
|
||||
|
||||
// CPU と GPU で必ず2スレッド使う
|
||||
num2 = cpu_num;
|
||||
if (num2 < 2)
|
||||
num2 = 2;
|
||||
*cpu_num2 = num2;
|
||||
|
||||
return num1;
|
||||
}
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
// 戸川 隼人 の「演習と応用FORTRAN77」の逆行列の計算方法を参考にして
|
||||
// Gaussian Elimination を少し修正して行列の数を一つにしてみた
|
||||
@@ -263,7 +307,7 @@ static int invert_matrix_st(unsigned short *mat,
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
// マルチ・プロセッサー対応
|
||||
|
||||
/*
|
||||
typedef struct { // RS threading control struct
|
||||
unsigned short *mat; // 行列
|
||||
int cols; // 横行の長さ
|
||||
@@ -308,8 +352,57 @@ static DWORD WINAPI thread_func(LPVOID lpParameter)
|
||||
CloseHandle(th->end);
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
typedef struct { // Maxtrix Inversion threading control struct
|
||||
unsigned short *mat; // 行列
|
||||
int cols; // 横行の長さ
|
||||
volatile int start; // 掛ける行の先頭位置
|
||||
volatile int pivot; // 倍率となる値の位置
|
||||
volatile int skip; // とばす行
|
||||
volatile int now; // 消去する行
|
||||
HANDLE run;
|
||||
HANDLE end;
|
||||
} INV_TH;
|
||||
|
||||
// サブ・スレッド
|
||||
static DWORD WINAPI thread_func(LPVOID lpParameter)
|
||||
{
|
||||
unsigned short *mat;
|
||||
int j, cols, row_start2, factor;
|
||||
HANDLE hRun, hEnd;
|
||||
INV_TH *th;
|
||||
|
||||
th = (INV_TH *)lpParameter;
|
||||
mat = th->mat;
|
||||
cols = th->cols;
|
||||
hRun = th->run;
|
||||
hEnd = th->end;
|
||||
SetEvent(hEnd); // 設定完了を通知する
|
||||
|
||||
WaitForSingleObject(hRun, INFINITE); // 計算開始の合図を待つ
|
||||
while (th->skip >= 0){
|
||||
while ((j = InterlockedDecrement(&(th->now))) >= 0){ // j = --th_now
|
||||
if (j == th->skip)
|
||||
continue;
|
||||
row_start2 = cols * j; // その行の開始位置
|
||||
factor = mat[row_start2 + th->pivot]; // j 行の pivot 列の値
|
||||
mat[row_start2 + th->pivot] = 0; // これが行列を一個で済ます手
|
||||
// 先の計算により、i 行の pivot 列の値は必ず 1なので、この factor が倍率になる
|
||||
galois_region_multiply(mat + th->start, mat + row_start2, cols, factor);
|
||||
}
|
||||
//_mm_sfence(); // メモリーへの書き込みを完了する
|
||||
SetEvent(hEnd); // 計算終了を通知する
|
||||
WaitForSingleObject(hRun, INFINITE); // 計算開始の合図を待つ
|
||||
}
|
||||
|
||||
// 終了処理
|
||||
CloseHandle(hRun);
|
||||
CloseHandle(hEnd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// マルチ・スレッドで逆行列を計算する (利用するパリティ・ブロックの所だけ)
|
||||
/*
|
||||
static int invert_matrix_mt(unsigned short *mat,
|
||||
int rows, // 横行の数、行列の縦サイズ、失われたソース・ブロックの数 = 利用するパリティ・ブロック数
|
||||
int cols, // 縦列の数、行列の横サイズ、本来のソース・ブロック数
|
||||
@@ -411,6 +504,130 @@ static int invert_matrix_mt(unsigned short *mat,
|
||||
CloseHandle(th->h);
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
static int invert_matrix_mt(unsigned short *mat,
|
||||
int rows, // 横行の数、行列の縦サイズ、失われたソース・ブロックの数 = 利用するパリティ・ブロック数
|
||||
int cols, // 縦列の数、行列の横サイズ、本来のソース・ブロック数
|
||||
source_ctx_r *s_blk) // 各ソース・ブロックの情報
|
||||
{
|
||||
int err = 0, j, row_start2, factor, sub_num;
|
||||
unsigned int time_last = GetTickCount();
|
||||
HANDLE hSub[MAX_CPU / 2], hRun[MAX_CPU / 2], hEnd[MAX_CPU / 2];
|
||||
INV_TH th[1];
|
||||
|
||||
memset(hSub, 0, sizeof(HANDLE) * (MAX_CPU / 2));
|
||||
memset(th, 0, sizeof(INV_TH));
|
||||
|
||||
// サブ・スレッドの数は平方根(切り上げ)にする
|
||||
sub_num = 1;
|
||||
j = 2;
|
||||
while (j < cpu_num){ // 1~2=1, 3~4=2, 5~8=3, 9~16=4, 17~32=5
|
||||
sub_num++;
|
||||
j *= 2;
|
||||
}
|
||||
if (sub_num > rows - 2)
|
||||
sub_num = rows - 2; // 多過ぎても意味ないので制限する
|
||||
#ifdef TIMER
|
||||
// 使うスレッド数は、メイン・スレッドの分も含めるので 1個増える
|
||||
printf("\nMaxtrix Inversion with %d threads\n", sub_num + 1);
|
||||
#endif
|
||||
|
||||
// サブ・スレッドを起動する
|
||||
th->mat = mat;
|
||||
th->cols = cols;
|
||||
for (j = 0; j < sub_num; j++){ // サブ・スレッドごとに
|
||||
// イベントを作成する
|
||||
hRun[j] = CreateEvent(NULL, FALSE, FALSE, NULL); // 両方とも Auto Reset にする
|
||||
if (hRun[j] == NULL){
|
||||
print_win32_err();
|
||||
printf("error, inv-thread\n");
|
||||
err = 1;
|
||||
goto error_end;
|
||||
}
|
||||
hEnd[j] = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (hEnd[j] == NULL){
|
||||
print_win32_err();
|
||||
CloseHandle(hRun[j]);
|
||||
printf("error, inv-thread\n");
|
||||
err = 1;
|
||||
goto error_end;
|
||||
}
|
||||
// サブ・スレッドを起動する
|
||||
th->run = hRun[j];
|
||||
th->end = hEnd[j];
|
||||
//_mm_sfence(); // メモリーへの書き込みを完了してからスレッドを起動する
|
||||
hSub[j] = (HANDLE)_beginthreadex(NULL, STACK_SIZE, thread_func, (LPVOID)th, 0, NULL);
|
||||
if (hSub[j] == NULL){
|
||||
print_win32_err();
|
||||
CloseHandle(hRun[j]);
|
||||
CloseHandle(hEnd[j]);
|
||||
printf("error, inv-thread\n");
|
||||
err = 1;
|
||||
goto error_end;
|
||||
}
|
||||
WaitForSingleObject(hEnd[j], INFINITE); // 設定終了の合図を待つ (リセットする)
|
||||
}
|
||||
|
||||
// Gaussian Elimination with 1 matrix
|
||||
th->pivot = 0;
|
||||
th->start = 0; // その行の開始位置
|
||||
for (th->skip = 0; th->skip < rows; th->skip++){
|
||||
// 経過表示
|
||||
if (GetTickCount() - time_last >= UPDATE_TIME){
|
||||
if (print_progress((th->skip * 1000) / rows)){
|
||||
err = 2;
|
||||
goto error_end;
|
||||
}
|
||||
time_last = GetTickCount();
|
||||
}
|
||||
|
||||
// その行 (パリティ・ブロック) がどのソース・ブロックの代用か
|
||||
while ((th->pivot < cols) && (s_blk[th->pivot].exist != 0))
|
||||
th->pivot++;
|
||||
|
||||
// Divide the row by element i,pivot
|
||||
factor = mat[th->start + th->pivot];
|
||||
if (factor > 1){
|
||||
mat[th->start + th->pivot] = 1; // これが行列を一個で済ます手
|
||||
galois_region_divide(mat + th->start, cols, factor);
|
||||
} else if (factor == 0){ // factor = 0 だと、その行列の逆行列を計算できない
|
||||
err = (0x00010000 | th->pivot); // どのソース・ブロックで問題が発生したのかを返す
|
||||
goto error_end;
|
||||
}
|
||||
|
||||
// 別の行の同じ pivot 列が 0以外なら、その値を 0にするために、
|
||||
// i 行を何倍かしたものを XOR する
|
||||
th->now = rows; // 初期値 + 1
|
||||
//_mm_sfence(); // メモリーへの書き込みを完了してからスレッドを再開する
|
||||
for (j = 0; j < sub_num; j++)
|
||||
SetEvent(hRun[j]); // サブ・スレッドに計算を開始させる
|
||||
while ((j = InterlockedDecrement(&(th->now))) >= 0){ // j = --th_now
|
||||
if (j == th->skip) // 同じ行はとばす
|
||||
continue;
|
||||
row_start2 = cols * j; // その行の開始位置
|
||||
factor = mat[row_start2 + th->pivot]; // j 行の pivot 列の値
|
||||
mat[row_start2 + th->pivot] = 0; // これが行列を一個で済ます手
|
||||
// 先の計算により、i 行の pivot 列の値は必ず 1なので、この factor が倍率になる
|
||||
galois_region_multiply(mat + th->start, mat + row_start2, cols, factor);
|
||||
}
|
||||
|
||||
WaitForMultipleObjects(sub_num, hEnd, TRUE, INFINITE); // サブ・スレッドの計算終了の合図を待つ
|
||||
th->start += cols;
|
||||
th->pivot++;
|
||||
}
|
||||
|
||||
error_end:
|
||||
InterlockedExchange(&(th->skip), -1); // 終了指示
|
||||
for (j = 0; j < sub_num; j++){
|
||||
if (hSub[j]){ // サブ・スレッドを終了させる
|
||||
SetEvent(hRun[j]);
|
||||
WaitForSingleObject(hSub[j], INFINITE);
|
||||
CloseHandle(hSub[j]);
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
/*
|
||||
@@ -525,7 +742,7 @@ int rs_encode(
|
||||
int err = 0;
|
||||
unsigned int len;
|
||||
#ifdef TIMER
|
||||
unsigned int time_total = GetTickCount();
|
||||
clock_t time_total = clock();
|
||||
#endif
|
||||
|
||||
if (galois_create_table()){
|
||||
@@ -539,11 +756,9 @@ unsigned int time_total = GetTickCount();
|
||||
}
|
||||
|
||||
// パリティ計算用の行列演算の準備をする
|
||||
if (parity_num > source_num){
|
||||
len = sizeof(unsigned short) * (source_num + parity_num);
|
||||
} else {
|
||||
len = sizeof(unsigned short) * source_num * 2;
|
||||
}
|
||||
len = sizeof(unsigned short) * source_num;
|
||||
if (OpenCL_method != 0)
|
||||
len *= 3; // GPU の作業領域も確保しておく
|
||||
constant = malloc(len);
|
||||
if (constant == NULL){
|
||||
printf("malloc, %d\n", len);
|
||||
@@ -551,7 +766,11 @@ unsigned int time_total = GetTickCount();
|
||||
goto error_end;
|
||||
}
|
||||
#ifdef TIMER
|
||||
printf("\nmatrix size = %d.%d KB\n", len >> 10, (len >> 10) % 10);
|
||||
if (len & 0xFFFFF000){
|
||||
printf("\nmatrix size = %u KB\n", len >> 10);
|
||||
} else {
|
||||
printf("\nmatrix size = %u Bytes\n", len);
|
||||
}
|
||||
#endif
|
||||
// パリティ検査行列の基になる定数
|
||||
make_encode_constant(constant);
|
||||
@@ -583,8 +802,8 @@ unsigned int time_total = GetTickCount();
|
||||
err = encode_method2(file_path, header_buf, rcv_hFile, files, s_blk, p_blk, constant);
|
||||
#ifdef TIMER
|
||||
if (err != 1){
|
||||
time_total = GetTickCount() - time_total;
|
||||
printf("total %d.%03d sec\n", time_total / 1000, time_total % 1000);
|
||||
time_total = clock() - time_total;
|
||||
printf("total %.3f sec\n", (double)time_total / CLOCKS_PER_SEC);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -614,7 +833,7 @@ int rs_encode_1pass(
|
||||
int err = 0;
|
||||
unsigned int len;
|
||||
#ifdef TIMER
|
||||
unsigned int time_total = GetTickCount();
|
||||
clock_t time_total = clock();
|
||||
#endif
|
||||
|
||||
if (galois_create_table()){
|
||||
@@ -623,11 +842,9 @@ unsigned int time_total = GetTickCount();
|
||||
}
|
||||
|
||||
// パリティ計算用の行列演算の準備をする
|
||||
if (parity_num > source_num){
|
||||
len = sizeof(unsigned short) * (source_num + parity_num);
|
||||
} else {
|
||||
len = sizeof(unsigned short) * source_num * 2;
|
||||
}
|
||||
len = sizeof(unsigned short) * source_num;
|
||||
if (OpenCL_method != 0)
|
||||
len *= 3; // GPU の作業領域も確保しておく
|
||||
constant = malloc(len);
|
||||
if (constant == NULL){
|
||||
printf("malloc, %d\n", len);
|
||||
@@ -635,7 +852,11 @@ unsigned int time_total = GetTickCount();
|
||||
goto error_end;
|
||||
}
|
||||
#ifdef TIMER
|
||||
printf("\nmatrix size = %d.%d KB\n", len >> 10, (len >> 10) % 10);
|
||||
if (len & 0xFFFFF000){
|
||||
printf("\nmatrix size = %u KB\n", len >> 10);
|
||||
} else {
|
||||
printf("\nmatrix size = %u Bytes\n", len);
|
||||
}
|
||||
#endif
|
||||
// パリティ検査行列の基になる定数
|
||||
make_encode_constant(constant);
|
||||
@@ -670,8 +891,8 @@ unsigned int time_total = GetTickCount();
|
||||
if (err < 0){
|
||||
printf("switching to 2-pass processing, %d\n", err);
|
||||
} else if (err != 1){
|
||||
time_total = GetTickCount() - time_total;
|
||||
printf("total %d.%03d sec\n", time_total / 1000, time_total % 1000);
|
||||
time_total = clock() - time_total;
|
||||
printf("total %.3f sec\n", (double)time_total / CLOCKS_PER_SEC);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -695,7 +916,7 @@ int rs_decode(
|
||||
int err = 0, i, j, k;
|
||||
unsigned int len;
|
||||
#ifdef TIMER
|
||||
unsigned int time_matrix = 0, time_total = GetTickCount();
|
||||
clock_t time_matrix = 0, time_total = clock();
|
||||
#endif
|
||||
|
||||
if (galois_create_table()){
|
||||
@@ -719,16 +940,18 @@ unsigned int time_matrix = 0, time_total = GetTickCount();
|
||||
}
|
||||
#ifdef TIMER
|
||||
if (len & 0xFFF00000){
|
||||
printf("\nmatrix size = %d.%d MB\n", len >> 20, (len >> 20) % 10);
|
||||
printf("\nmatrix size = %u MB\n", len >> 20);
|
||||
} else if (len & 0x000FF000){
|
||||
printf("\nmatrix size = %u KB\n", len >> 10);
|
||||
} else {
|
||||
printf("\nmatrix size = %d.%d KB\n", len >> 10, (len >> 10) % 10);
|
||||
printf("\nmatrix size = %u Bytes\n", len);
|
||||
}
|
||||
#endif
|
||||
// 何番目の消失ソース・ブロックがどのパリティで代替されるか
|
||||
id = mat + (block_lost * source_num);
|
||||
|
||||
#ifdef TIMER
|
||||
time_matrix = GetTickCount();
|
||||
time_matrix = clock();
|
||||
#endif
|
||||
// 復元用の行列を計算する
|
||||
print_progress_text(0, "Computing matrix");
|
||||
@@ -769,7 +992,7 @@ time_matrix = GetTickCount();
|
||||
//for (i = 0; i < block_lost; i++)
|
||||
// printf("id[%d] = %d\n", i, id[i]);
|
||||
#ifdef TIMER
|
||||
time_matrix = GetTickCount() - time_matrix;
|
||||
time_matrix = clock() - time_matrix;
|
||||
#endif
|
||||
|
||||
#ifdef TIMER
|
||||
@@ -782,8 +1005,7 @@ time_matrix = GetTickCount() - time_matrix;
|
||||
// ブロック数が多いなら、ブロックごとにスレッドを割り当てる (GPU を使う)
|
||||
if (memory_use & 16){
|
||||
err = -4; // SSD なら Read all 方式でブロックが断片化しても速い
|
||||
} else
|
||||
if (read_block_num(block_lost, 2, 0, MEM_UNIT) != 0){
|
||||
} else if (read_block_num(block_lost * 2, 0, MEM_UNIT) != 0){
|
||||
err = -5; // HDD でメモリーが足りてるなら Read some 方式を使う
|
||||
} else {
|
||||
err = -4; // メモリー不足なら Read all 方式でブロックを断片化させる
|
||||
@@ -792,8 +1014,7 @@ time_matrix = GetTickCount() - time_matrix;
|
||||
// ソース・ブロックを全て断片的に読み込むか、いくつかを丸ごと読み込むかを決める
|
||||
if (memory_use & 16){
|
||||
err = -2; // SSD なら Read all 方式でブロックが断片化しても速い
|
||||
} else
|
||||
if (read_block_num(block_lost, cpu_num - 1, 0, sse_unit) != 0){
|
||||
} else if (read_block_num(block_lost, 0, sse_unit) != 0){
|
||||
err = -3; // HDD でメモリーが足りてるなら Read some 方式を使う
|
||||
} else {
|
||||
err = -2; // メモリー不足なら Read all 方式でブロックを断片化させる
|
||||
@@ -814,9 +1035,9 @@ time_matrix = GetTickCount() - time_matrix;
|
||||
err = decode_method2(file_path, block_lost, rcv_hFile, files, s_blk, p_blk, mat);
|
||||
#ifdef TIMER
|
||||
if (err != 1){
|
||||
time_total = GetTickCount() - time_total;
|
||||
printf("total %d.%03d sec\n", time_total / 1000, time_total % 1000);
|
||||
printf("matrix %d.%03d sec\n", time_matrix / 1000, time_matrix % 1000);
|
||||
time_total = clock() - time_total;
|
||||
printf("total %.3f sec\n", (double)time_total / CLOCKS_PER_SEC);
|
||||
printf("matrix %.3f sec\n", (double)time_matrix / CLOCKS_PER_SEC);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ extern "C" {
|
||||
|
||||
// Read all source & Keep some parity 方式
|
||||
// 部分的なエンコードを行う最低ブロック数
|
||||
#define PART_MAX_RATE 1 // ソース・ブロック数の 1/2 = 50%
|
||||
#define PART_MIN_RATE 5 // ソース・ブロック数の 1/32 = 3.1%
|
||||
|
||||
// Read some source & Keep all parity 方式
|
||||
@@ -18,6 +17,10 @@ extern "C" {
|
||||
#define READ_MIN_RATE 1 // 保持するブロック数の 1/2 = 50%
|
||||
#define READ_MIN_NUM 16
|
||||
|
||||
// CPU cache 最適化のため、同時に処理するブロック数を制限する
|
||||
#define CACHE_MIN_NUM 8
|
||||
#define CACHE_MAX_NUM 128
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
// Cache Blocking を試みる
|
||||
@@ -33,10 +36,15 @@ unsigned int get_io_size(
|
||||
// 何ブロックまとめてファイルから読み込むかを空きメモリー量から計算する
|
||||
int read_block_num(
|
||||
int keep_num, // 保持するパリティ・ブロック数
|
||||
int add_num, // 余裕を見るブロック数
|
||||
size_t trial_alloc, // 確保できるか確認するのか
|
||||
int alloc_unit); // メモリー単位の境界 (sse_unit か MEM_UNIT)
|
||||
|
||||
// 1st encode, decode を何スレッドで実行するか決める
|
||||
int calc_thread_num1(int max_num);
|
||||
|
||||
// 1st & 2nd encode, decode を何スレッドで実行するか決める
|
||||
int calc_thread_num2(int max_num, int *cpu_num2);
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
// リード・ソロモン符号を使ってエンコードする
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
1 RT_STRING ".\\source.cl"
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION 1,3,2,8
|
||||
PRODUCTVERSION 1,3,2,0
|
||||
FILEVERSION 1,3,3,3
|
||||
PRODUCTVERSION 1,3,3,0
|
||||
FILEOS 0x40004
|
||||
FILETYPE 0x1
|
||||
{
|
||||
@@ -11,10 +11,10 @@ BLOCK "StringFileInfo"
|
||||
BLOCK "040904B0"
|
||||
{
|
||||
VALUE "FileDescription", "PAR2 client"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2023 Yutaka Sawada"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2024 Yutaka Sawada"
|
||||
VALUE "ProductName", "par2j"
|
||||
VALUE "FileVersion", "1.3.2.8"
|
||||
VALUE "ProductVersion", "1.3.2.0"
|
||||
VALUE "FileVersion", "1.3.3.3"
|
||||
VALUE "ProductVersion", "1.3.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,11 @@
|
||||
void calc_table(__local uint *mtab, int id, int factor)
|
||||
{
|
||||
int i, sum = 0;
|
||||
int i, sum;
|
||||
|
||||
for (i = 0; i < 8; i++){
|
||||
sum = (id & (1 << i)) ? (sum ^ factor) : sum;
|
||||
factor = (factor & 0x8000) ? ((factor << 1) ^ 0x1100B) : (factor << 1);
|
||||
sum = ((id << 31) >> 31) & factor;
|
||||
for (i = 1; i < 8; i++){
|
||||
factor = (factor << 1) ^ (((factor << 16) >> 31) & 0x1100B);
|
||||
sum ^= ((id << (31 - i)) >> 31) & factor;
|
||||
}
|
||||
mtab[id] = sum;
|
||||
|
||||
@@ -14,6 +15,30 @@ void calc_table(__local uint *mtab, int id, int factor)
|
||||
mtab[id + 256] = sum;
|
||||
}
|
||||
|
||||
void calc_table2(__local uint *mtab, int id, int factor, int factor2)
|
||||
{
|
||||
int i, sum, sum2, mask;
|
||||
|
||||
mask = (id << 31) >> 31;
|
||||
sum = mask & factor;
|
||||
sum2 = mask & factor2;
|
||||
for (i = 1; i < 8; i++){
|
||||
factor = (factor << 1) ^ (((factor << 16) >> 31) & 0x1100B);
|
||||
factor2 = (factor2 << 1) ^ (((factor2 << 16) >> 31) & 0x1100B);
|
||||
mask = (id << (31 - i)) >> 31;
|
||||
sum ^= mask & factor;
|
||||
sum2 ^= mask & factor2;
|
||||
}
|
||||
mtab[id] = sum | (sum2 << 16);
|
||||
|
||||
sum = (sum << 4) ^ (((sum << 16) >> 31) & 0x88058) ^ (((sum << 17) >> 31) & 0x4402C) ^ (((sum << 18) >> 31) & 0x22016) ^ (((sum << 19) >> 31) & 0x1100B);
|
||||
sum = (sum << 4) ^ (((sum << 16) >> 31) & 0x88058) ^ (((sum << 17) >> 31) & 0x4402C) ^ (((sum << 18) >> 31) & 0x22016) ^ (((sum << 19) >> 31) & 0x1100B);
|
||||
sum2 = (sum2 << 4) ^ (((sum2 << 16) >> 31) & 0x88058) ^ (((sum2 << 17) >> 31) & 0x4402C) ^ (((sum2 << 18) >> 31) & 0x22016) ^ (((sum2 << 19) >> 31) & 0x1100B);
|
||||
sum2 = (sum2 << 4) ^ (((sum2 << 16) >> 31) & 0x88058) ^ (((sum2 << 17) >> 31) & 0x4402C) ^ (((sum2 << 18) >> 31) & 0x22016) ^ (((sum2 << 19) >> 31) & 0x1100B);
|
||||
|
||||
mtab[id + 256] = sum | (sum2 << 16);
|
||||
}
|
||||
|
||||
__kernel void method1(
|
||||
__global uint *src,
|
||||
__global uint *dst,
|
||||
@@ -31,6 +56,7 @@ __kernel void method1(
|
||||
dst[i] = 0;
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table(mtab, table_id, factors[blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
@@ -42,7 +68,6 @@ __kernel void method1(
|
||||
dst[i] ^= sum;
|
||||
}
|
||||
src += BLK_SIZE;
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +90,7 @@ __kernel void method2(
|
||||
}
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table(mtab, table_id, factors[blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
@@ -82,64 +108,182 @@ __kernel void method2(
|
||||
dst[pos + 4] ^= ((sum1 & 0xFF00FF00) >> 8) | (sum2 & 0xFF00FF00);
|
||||
}
|
||||
src += BLK_SIZE;
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void method3(
|
||||
__kernel void method4(
|
||||
__global uint4 *src,
|
||||
__global uint4 *dst,
|
||||
__global ushort *factors,
|
||||
int blk_num)
|
||||
{
|
||||
__local uint mtab[512];
|
||||
int i, blk;
|
||||
uchar4 r0, r1, r2, r3, r4, r5, r6, r7;
|
||||
uchar16 lo, hi;
|
||||
const int work_id = get_global_id(0) * 2;
|
||||
const int work_size = get_global_size(0) * 2;
|
||||
const int table_id = get_local_id(0);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE / 4; i += work_size){
|
||||
dst[i ] = 0;
|
||||
dst[i + 1] = 0;
|
||||
}
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table(mtab, table_id, factors[blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE / 4; i += work_size){
|
||||
lo = as_uchar16(src[i ]);
|
||||
hi = as_uchar16(src[i + 1]);
|
||||
r0 = (uchar4)(as_uchar2((ushort)(mtab[lo.s0] ^ mtab[256 + hi.s0])), as_uchar2((ushort)(mtab[lo.s1] ^ mtab[256 + hi.s1])));
|
||||
r1 = (uchar4)(as_uchar2((ushort)(mtab[lo.s2] ^ mtab[256 + hi.s2])), as_uchar2((ushort)(mtab[lo.s3] ^ mtab[256 + hi.s3])));
|
||||
r2 = (uchar4)(as_uchar2((ushort)(mtab[lo.s4] ^ mtab[256 + hi.s4])), as_uchar2((ushort)(mtab[lo.s5] ^ mtab[256 + hi.s5])));
|
||||
r3 = (uchar4)(as_uchar2((ushort)(mtab[lo.s6] ^ mtab[256 + hi.s6])), as_uchar2((ushort)(mtab[lo.s7] ^ mtab[256 + hi.s7])));
|
||||
r4 = (uchar4)(as_uchar2((ushort)(mtab[lo.s8] ^ mtab[256 + hi.s8])), as_uchar2((ushort)(mtab[lo.s9] ^ mtab[256 + hi.s9])));
|
||||
r5 = (uchar4)(as_uchar2((ushort)(mtab[lo.sa] ^ mtab[256 + hi.sa])), as_uchar2((ushort)(mtab[lo.sb] ^ mtab[256 + hi.sb])));
|
||||
r6 = (uchar4)(as_uchar2((ushort)(mtab[lo.sc] ^ mtab[256 + hi.sc])), as_uchar2((ushort)(mtab[lo.sd] ^ mtab[256 + hi.sd])));
|
||||
r7 = (uchar4)(as_uchar2((ushort)(mtab[lo.se] ^ mtab[256 + hi.se])), as_uchar2((ushort)(mtab[lo.sf] ^ mtab[256 + hi.sf])));
|
||||
dst[i ] ^= as_uint4((uchar16)(r0.x, r0.z, r1.x, r1.z, r2.x, r2.z, r3.x, r3.z, r4.x, r4.z, r5.x, r5.z, r6.x, r6.z, r7.x, r7.z));
|
||||
dst[i + 1] ^= as_uint4((uchar16)(r0.y, r0.w, r1.y, r1.w, r2.y, r2.w, r3.y, r3.w, r4.y, r4.w, r5.y, r5.w, r6.y, r6.w, r7.y, r7.w));
|
||||
}
|
||||
src += BLK_SIZE / 4;
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void method9(
|
||||
__global uint *src,
|
||||
__global uint *dst,
|
||||
__global ushort *factors,
|
||||
int blk_num)
|
||||
{
|
||||
__global uint *blk_src;
|
||||
__local uint mtab[512];
|
||||
int i, blk, chk_size, remain, pos;
|
||||
uint lo, hi, sum1, sum2;
|
||||
int i, blk;
|
||||
uint v, sum, sum2;
|
||||
const int work_id = get_global_id(0);
|
||||
const int work_size = get_global_size(0);
|
||||
const int table_id = get_local_id(0);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE; i += work_size){
|
||||
dst[i] = 0;
|
||||
dst[i + BLK_SIZE] = 0;
|
||||
}
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table2(mtab, table_id, factors[blk], factors[blk_num + blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE; i += work_size){
|
||||
v = src[i];
|
||||
sum = mtab[(uchar)v] ^ mtab[256 + (uchar)(v >> 8)];
|
||||
sum2 = mtab[(uchar)(v >> 16)] ^ mtab[256 + (v >> 24)];
|
||||
dst[i] ^= (sum & 0xFFFF) | (sum2 << 16);
|
||||
dst[i + BLK_SIZE] ^= (sum >> 16) | (sum2 & 0xFFFF0000);
|
||||
}
|
||||
src += BLK_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void method10(
|
||||
__global uint *src,
|
||||
__global uint *dst,
|
||||
__global ushort *factors,
|
||||
int blk_num)
|
||||
{
|
||||
__local uint mtab[512];
|
||||
int i, blk, pos;
|
||||
uint lo, hi, t0, t1, t2, t3;
|
||||
const int work_id = get_global_id(0) * 2;
|
||||
const int work_size = get_global_size(0) * 2;
|
||||
const int table_id = get_local_id(0);
|
||||
|
||||
remain = BLK_SIZE;
|
||||
chk_size = CHK_SIZE;
|
||||
while (remain > 0){
|
||||
if (chk_size > remain)
|
||||
chk_size = remain;
|
||||
for (i = work_id; i < BLK_SIZE; i += work_size){
|
||||
dst[i ] = 0;
|
||||
dst[i + 1] = 0;
|
||||
dst[i + BLK_SIZE ] = 0;
|
||||
dst[i + BLK_SIZE + 1] = 0;
|
||||
}
|
||||
|
||||
for (i = work_id; i < chk_size; i += work_size){
|
||||
dst[i ] = 0;
|
||||
dst[i + 1] = 0;
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table2(mtab, table_id, factors[blk], factors[blk_num + blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE; i += work_size){
|
||||
pos = (i & ~7) + ((i & 7) >> 1);
|
||||
lo = src[pos ];
|
||||
hi = src[pos + 4];
|
||||
t0 = mtab[(uchar)lo] ^ mtab[256 + (uchar)hi];
|
||||
t1 = mtab[(uchar)(lo >> 8)] ^ mtab[256 + (uchar)(hi >> 8)];
|
||||
t2 = mtab[(uchar)(lo >> 16)] ^ mtab[256 + (uchar)(hi >> 16)];
|
||||
t3 = mtab[lo >> 24] ^ mtab[256 + (hi >> 24)];
|
||||
dst[pos ] ^= (uchar)t0 | ((t1 << 8) & 0xFF00) | ((t2 << 16) & 0xFF0000) | (t3 << 24);
|
||||
dst[pos + 4] ^= (uchar)(t0 >> 8) | (t1 & 0xFF00) | ((t2 << 8) & 0xFF0000) | ((t3 << 16) & 0xFF000000);
|
||||
dst[pos + BLK_SIZE ] ^= (uchar)(t0 >> 16) | ((t1 >> 8) & 0xFF00) | (t2 & 0xFF0000) | ((t3 << 8) & 0xFF000000);
|
||||
dst[pos + BLK_SIZE + 4] ^= (t0 >> 24) | ((t1 >> 16) & 0xFF00) | ((t2 >> 8) & 0xFF0000) | (t3 & 0xFF000000);
|
||||
}
|
||||
|
||||
blk_src = src;
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
calc_table(mtab, table_id, factors[blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
for (i = work_id; i < chk_size; i += work_size){
|
||||
pos = (i & ~7) + ((i & 7) >> 1);
|
||||
lo = blk_src[pos ];
|
||||
hi = blk_src[pos + 4];
|
||||
sum1 = mtab[(uchar)(lo >> 16)] ^ mtab[256 + (uchar)(hi >> 16)];
|
||||
sum2 = mtab[lo >> 24] ^ mtab[256 + (hi >> 24)];
|
||||
sum1 <<= 16;
|
||||
sum2 <<= 16;
|
||||
sum1 ^= mtab[(uchar)lo] ^ mtab[256 + (uchar)hi];
|
||||
sum2 ^= mtab[(uchar)(lo >> 8)] ^ mtab[256 + (uchar)(hi >> 8)];
|
||||
dst[pos ] ^= (sum1 & 0x00FF00FF) | ((sum2 & 0x00FF00FF) << 8);
|
||||
dst[pos + 4] ^= ((sum1 & 0xFF00FF00) >> 8) | (sum2 & 0xFF00FF00);
|
||||
}
|
||||
blk_src += BLK_SIZE;
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
}
|
||||
|
||||
src += CHK_SIZE;
|
||||
dst += CHK_SIZE;
|
||||
remain -= CHK_SIZE;
|
||||
src += BLK_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void method4(
|
||||
__kernel void method12(
|
||||
__global uint4 *src,
|
||||
__global uint4 *dst,
|
||||
__global ushort *factors,
|
||||
int blk_num)
|
||||
{
|
||||
__local uint mtab[512];
|
||||
int i, blk;
|
||||
uchar4 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF;
|
||||
uchar16 lo, hi;
|
||||
const int work_id = get_global_id(0) * 2;
|
||||
const int work_size = get_global_size(0) * 2;
|
||||
const int table_id = get_local_id(0);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE / 4; i += work_size){
|
||||
dst[i ] = 0;
|
||||
dst[i + 1] = 0;
|
||||
dst[i + BLK_SIZE / 4 ] = 0;
|
||||
dst[i + BLK_SIZE / 4 + 1] = 0;
|
||||
}
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
calc_table2(mtab, table_id, factors[blk], factors[blk_num + blk]);
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
for (i = work_id; i < BLK_SIZE / 4; i += work_size){
|
||||
lo = as_uchar16(src[i ]);
|
||||
hi = as_uchar16(src[i + 1]);
|
||||
r0 = as_uchar4(mtab[lo.s0] ^ mtab[256 + hi.s0]);
|
||||
r1 = as_uchar4(mtab[lo.s1] ^ mtab[256 + hi.s1]);
|
||||
r2 = as_uchar4(mtab[lo.s2] ^ mtab[256 + hi.s2]);
|
||||
r3 = as_uchar4(mtab[lo.s3] ^ mtab[256 + hi.s3]);
|
||||
r4 = as_uchar4(mtab[lo.s4] ^ mtab[256 + hi.s4]);
|
||||
r5 = as_uchar4(mtab[lo.s5] ^ mtab[256 + hi.s5]);
|
||||
r6 = as_uchar4(mtab[lo.s6] ^ mtab[256 + hi.s6]);
|
||||
r7 = as_uchar4(mtab[lo.s7] ^ mtab[256 + hi.s7]);
|
||||
r8 = as_uchar4(mtab[lo.s8] ^ mtab[256 + hi.s8]);
|
||||
r9 = as_uchar4(mtab[lo.s9] ^ mtab[256 + hi.s9]);
|
||||
rA = as_uchar4(mtab[lo.sa] ^ mtab[256 + hi.sa]);
|
||||
rB = as_uchar4(mtab[lo.sb] ^ mtab[256 + hi.sb]);
|
||||
rC = as_uchar4(mtab[lo.sc] ^ mtab[256 + hi.sc]);
|
||||
rD = as_uchar4(mtab[lo.sd] ^ mtab[256 + hi.sd]);
|
||||
rE = as_uchar4(mtab[lo.se] ^ mtab[256 + hi.se]);
|
||||
rF = as_uchar4(mtab[lo.sf] ^ mtab[256 + hi.sf]);
|
||||
dst[i ] ^= as_uint4((uchar16)(r0.x, r1.x, r2.x, r3.x, r4.x, r5.x, r6.x, r7.x, r8.x, r9.x, rA.x, rB.x, rC.x, rD.x, rE.x, rF.x));
|
||||
dst[i + 1] ^= as_uint4((uchar16)(r0.y, r1.y, r2.y, r3.y, r4.y, r5.y, r6.y, r7.y, r8.y, r9.y, rA.y, rB.y, rC.y, rD.y, rE.y, rF.y));
|
||||
dst[i + BLK_SIZE / 4 ] ^= as_uint4((uchar16)(r0.z, r1.z, r2.z, r3.z, r4.z, r5.z, r6.z, r7.z, r8.z, r9.z, rA.z, rB.z, rC.z, rD.z, rE.z, rF.z));
|
||||
dst[i + BLK_SIZE / 4 + 1] ^= as_uint4((uchar16)(r0.w, r1.w, r2.w, r3.w, r4.w, r5.w, r6.w, r7.w, r8.w, r9.w, rA.w, rB.w, rC.w, rD.w, rE.w, rF.w));
|
||||
}
|
||||
src += BLK_SIZE / 4;
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void method16(
|
||||
__global uint *src,
|
||||
__global uint *dst,
|
||||
__global ushort *factors,
|
||||
@@ -147,7 +291,7 @@ __kernel void method4(
|
||||
{
|
||||
__local int table[16];
|
||||
__local uint cache[256];
|
||||
int i, j, blk, pos, sht, mask;
|
||||
int i, j, blk, pos, mask, tmp;
|
||||
uint sum;
|
||||
const int work_id = get_global_id(0);
|
||||
const int work_size = get_global_size(0);
|
||||
@@ -157,11 +301,12 @@ __kernel void method4(
|
||||
|
||||
for (blk = 0; blk < blk_num; blk++){
|
||||
if (get_local_id(0) == 0){
|
||||
pos = factors[blk] << 16;
|
||||
table[0] = pos;
|
||||
tmp = factors[blk];
|
||||
table[0] = tmp;
|
||||
for (j = 1; j < 16; j++){
|
||||
pos = (pos << 1) ^ ((pos >> 31) & 0x100B0000);
|
||||
table[j] = pos;
|
||||
mask = (tmp & 0x8000) ? 0x1100B : 0;
|
||||
tmp = (tmp << 1) ^ mask;
|
||||
table[j] = tmp;
|
||||
}
|
||||
}
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
@@ -172,10 +317,11 @@ __kernel void method4(
|
||||
barrier(CLK_LOCAL_MEM_FENCE);
|
||||
|
||||
sum = 0;
|
||||
sht = (i & 60) >> 2;
|
||||
tmp = (i & 60) >> 2;
|
||||
tmp = 0x8000 >> tmp;
|
||||
pos &= ~60;
|
||||
for (j = 15; j >= 0; j--){
|
||||
mask = (table[j] << sht) >> 31;
|
||||
mask = (table[j] & tmp) ? 0xFFFFFFFF : 0;
|
||||
sum ^= mask & cache[pos];
|
||||
pos += 4;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// verify.c
|
||||
// Copyright : 2022-10-14 Yutaka Sawada
|
||||
// Copyright : 2024-06-09 Yutaka Sawada
|
||||
// License : GPL
|
||||
|
||||
#ifndef _UNICODE
|
||||
@@ -1253,21 +1253,22 @@ static int search_block_slide(
|
||||
slice_ctx *sc)
|
||||
{
|
||||
unsigned char *buf, hash[16], hash2[16], err_mag, *short_use;
|
||||
int i, j, find_num, find_flag, find_next, find_last, short_next;
|
||||
int i, j, find_num, find_flag, find_next, find_last, short_next, short2_next, tmp_next;
|
||||
int block_count, short_count, tiny_count, tiny_skip, num, i1, i2, i3, i4;
|
||||
int *order, *index, index_shift;
|
||||
unsigned int len, off, end_off, err_off;
|
||||
unsigned int prev_crc, fail_count, rear_off, overlap_count;
|
||||
unsigned int crc, *crcs, *short_crcs;
|
||||
unsigned int time_last, time_slide;
|
||||
__int64 file_off, file_next, short_off, fail_off;
|
||||
__int64 file_off, file_next, short_off, short2_off, tmp_off, fail_off;
|
||||
|
||||
if (file_size + 1 < last_off + (__int64)(sc->min_size))
|
||||
return 0; // 小さすぎるファイルは調べない
|
||||
find_num = 0; // このファイル内で何ブロック見つけたか
|
||||
find_next = -1; // 次に見つかると予想したブロックの番号
|
||||
find_last = -1; // 最後に見つけたブロックの番号 (-1=不明)
|
||||
short_next = -1;
|
||||
short_next = -1; // 予想される末尾ブロックの番号
|
||||
short2_next = -1;
|
||||
fail_count = 0; // CRC は一致したけど MD5 が違った回数
|
||||
fail_off = 0;
|
||||
rear_off = 0;
|
||||
@@ -1278,24 +1279,32 @@ static int search_block_slide(
|
||||
find_last = find_next - 1; // 最後に見つけたブロックの番号
|
||||
if ((last_off >= files[num1].size) || (last_off + block_size > file_size + 1))
|
||||
find_next = -1; // 予想位置がファイル・サイズを超えると駄目
|
||||
if ((last_size < block_size) && (files[num1].b_num >= 2) && // 末尾の半端なブロックの番号と想定位置
|
||||
(last_off < files[num1].size) && (files[num1].size <= file_size + 1)){
|
||||
short_next = files[num1].b_off + files[num1].b_num - 1; // 末尾ブロックの番号
|
||||
if (find_next == short_next)
|
||||
if ((last_size < block_size) && (last_off < files[num1].size)){ // 末尾の半端なブロックの番号と想定位置
|
||||
tmp_next = files[num1].b_off + files[num1].b_num - 1; // 末尾ブロックの番号
|
||||
if (find_next == tmp_next)
|
||||
find_next = -1; // 予想が重複したら末尾ブロックとして探す
|
||||
short_off = files[num1].size - last_size;
|
||||
// ファイルサイズが1ブロック未満でも、同じサイズならエラー訂正を試みる
|
||||
} else if ((last_off == 0) && (file_size == files[num1].size) && (file_size < (__int64)block_size)){
|
||||
short_off = 0;
|
||||
short_next = files[num1].b_off;
|
||||
if ((files[num1].b_num >= 2) && (files[num1].size <= file_size + 1)){ // 本来の位置を調べる
|
||||
short_next = tmp_next;
|
||||
short_off = files[num1].size - last_size;
|
||||
} else if ((last_off == 0) && (file_size == last_size)){ // ファイルが1ブロック未満でも、同じサイズならエラー訂正を試みる
|
||||
short_next = tmp_next;
|
||||
short_off = 0;
|
||||
}
|
||||
if (last_size < file_size){ // 末尾を調べる
|
||||
short2_next = tmp_next;
|
||||
short2_off = file_size - last_size;
|
||||
}
|
||||
}
|
||||
if (file_size > files[num1].size){
|
||||
rear_off = (unsigned int)((file_size - files[num1].size) % (__int64)block_size);
|
||||
} else if (file_size < files[num1].size){
|
||||
rear_off = block_size - (unsigned int)((files[num1].size - file_size) % (__int64)block_size);
|
||||
}
|
||||
//printf("file = %d, find_next = %d, find_last = %d\n", num1, find_next, find_last);
|
||||
//printf("short_off = %I64d, short_next = %d, rear_off = %d\n", short_off, short_next, rear_off);
|
||||
/* printf("file = %d, find_next = %d, find_last = %d, rear_off = %d\n", num1, find_next, find_last, rear_off);
|
||||
if (short_next >= 0)
|
||||
printf("short_off = %I64d, short_next = %d\n", short_off, short_next);
|
||||
if (short2_next >= 0)
|
||||
printf("short2_off = %I64d, short2_next = %d\n", short2_off, short2_next);*/
|
||||
}
|
||||
file_off = last_off; // 検査開始位置から調べる
|
||||
buf = sc->buf;
|
||||
@@ -1374,8 +1383,11 @@ static int search_block_slide(
|
||||
if (last_off < file_off + last_size)
|
||||
last_off = file_off + last_size; // 一番大きな半端なブロックの終端
|
||||
find_next = -2; // 小さなファイルが見つかった = ブロック検出の予想が外れた
|
||||
if (i == short_next)
|
||||
short_next = -1; // 末尾ブロックは検出済み
|
||||
if (i == short_next){ // この末尾ブロックは検出済み
|
||||
short_next = -1;
|
||||
} else if (i == short2_next){
|
||||
short2_next = -1;
|
||||
}
|
||||
|
||||
// 経過表示
|
||||
if (GetTickCount() - time_last >= UPDATE_TIME){
|
||||
@@ -1416,7 +1428,7 @@ static int search_block_slide(
|
||||
|
||||
// ブロック・サイズごとに探す
|
||||
if (((block_count > 0) && ((file_off + (__int64)block_size <= file_size)
|
||||
|| (find_next >= 0))) || (short_next >= 0)){ // ブロックの位置を予想して探す
|
||||
|| (find_next >= 0))) || (short_next >= 0) || (short2_next >= 0)){ // ブロックの位置を予想して探す
|
||||
// 前からスライドさせながらチェックサムを比較する
|
||||
//printf("slide search from %I64d, file %d, next = %d\n", file_off, num1, find_next);
|
||||
off = 0; // buf 内でのオフセット
|
||||
@@ -1445,8 +1457,13 @@ static int search_block_slide(
|
||||
while (off < end_off){
|
||||
find_flag = -2;
|
||||
// 次の番号のブロックがその位置にあるかを先に調べる (発見済みでも)
|
||||
if ((short_next >= 0) && (file_off + off == short_off)){ // 半端なブロックなら
|
||||
i = short_next;
|
||||
if (((short_next >= 0) && (file_off + off == short_off)) ||
|
||||
((short2_next >= 0) && (file_off + off == short2_off))){ // 半端なブロックなら
|
||||
if ((short_next >= 0) && (file_off + off == short_off)){
|
||||
i = short_next;
|
||||
} else {
|
||||
i = short2_next;
|
||||
}
|
||||
num = s_blk[i].file;
|
||||
if ((short_use[num] & 4) == 0){ // パディング部分を取り除いた CRC-32 を逆算する
|
||||
short_crcs[num] = crc_reverse_zero(s_blk[i].crc, block_size - s_blk[i].size);
|
||||
@@ -1456,7 +1473,8 @@ static int search_block_slide(
|
||||
find_flag = correct_error(buf + off, s_blk[i].size, s_blk[i].hash, short_crcs[num], &err_off, &err_mag);
|
||||
if (find_flag == 0)
|
||||
find_flag = 2;
|
||||
} else if ((find_next >= 0) && (file_off + off == last_off)){ // フルサイズのブロックなら
|
||||
}
|
||||
if ((find_flag < 0) && (find_next >= 0) && (file_off + off == last_off)){ // フルサイズのブロックなら
|
||||
i = find_next;
|
||||
if (crc == s_blk[i].crc){
|
||||
data_md5(buf + off, block_size, hash);
|
||||
@@ -1661,20 +1679,81 @@ static int search_block_slide(
|
||||
find_next = i + 1;
|
||||
if ((find_next >= source_num) || (s_blk[find_next].file != num)){
|
||||
// 最後までいった、またはファイルが異なる
|
||||
short_next = -1;
|
||||
find_next = -1;
|
||||
if ((short_next >= 0) && ((s_blk[short_next].exist & 0x1000) != 0))
|
||||
short_next = -1;
|
||||
if ((short2_next >= 0) && ((s_blk[short2_next].exist & 0x1000) != 0))
|
||||
short2_next = -1;
|
||||
} else if (s_blk[find_next].size < block_size){ // 半端なブロックは別に調べる
|
||||
short_next = find_next;
|
||||
short_off = file_off + off + block_size;
|
||||
//printf("short_off = %I64d, short_next = %d, file = %d\n", short_off, short_next, num);
|
||||
if (file_off + off + block_size + s_blk[find_next].size <= file_size){ // ファイル内に収まってる時だけ
|
||||
tmp_next = find_next;
|
||||
tmp_off = file_off + off + block_size;
|
||||
if (find_flag <= 3){ // 順当な位置で見つけた場合
|
||||
if ((tmp_next == short_next) && (tmp_off == short_off)){
|
||||
// 予測済みのと一致するなら何もしない
|
||||
} else if ((short_next >= 0) && (short2_next < 0)){ // 予測と異なるけど、別のが空いてるなら、そっちに記録する
|
||||
//printf("short2_off = %I64d, short2_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short2_next = tmp_next;
|
||||
short2_off = tmp_off;
|
||||
} else {
|
||||
if ((short_next >= 0) && (tmp_next == short2_next) && (tmp_off == short2_off)){ // 既に予測済みのと一致するなら入れ替える
|
||||
short2_next = short_next;
|
||||
short2_off = short_off;
|
||||
//printf("exchange short2_off = %I64d, short2_next = %d\n", short2_off, short2_next);
|
||||
}
|
||||
//printf("short_off = %I64d, short_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short_next = tmp_next;
|
||||
short_off = tmp_off;
|
||||
}
|
||||
} else if ((short_next < 0) &&
|
||||
(((__int64)block_size * (__int64)(tmp_next - files[num].b_off) == tmp_off) ||
|
||||
(tmp_off + s_blk[tmp_next].size == file_size))){
|
||||
// 検出ブロックが順当でなくても、末尾ブロックの開始位置や末端がファイル・サイズに一致すれば
|
||||
//printf("short_off = %I64d, short_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short_next = tmp_next;
|
||||
short_off = tmp_off;
|
||||
} else {
|
||||
//printf("short2_off = %I64d, short2_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short2_next = tmp_next;
|
||||
short2_off = tmp_off;
|
||||
}
|
||||
}
|
||||
find_next = -1;
|
||||
} else {
|
||||
short_next = files[num].b_off + files[num].b_num - 1; // 末尾ブロックの番号
|
||||
if (s_blk[short_next].size < block_size){ // 半端なブロックは別に調べる
|
||||
short_off = file_off + off + (__int64)(short_next - i) * (__int64)block_size;
|
||||
//printf("short_off = %I64d, short_next = %d, file = %d\n", short_off, short_next, num);
|
||||
} else {
|
||||
short_next = -1;
|
||||
tmp_next = files[num].b_off + files[num].b_num - 1; // 末尾ブロックの番号
|
||||
if (s_blk[tmp_next].size < block_size){ // 半端なブロックは別に調べる
|
||||
tmp_off = file_off + off + (__int64)(tmp_next - i) * (__int64)block_size;
|
||||
if (tmp_off + s_blk[tmp_next].size <= file_size){ // ファイル内に収まってる時だけ
|
||||
if (find_flag <= 3){ // 順当な位置で見つけた場合
|
||||
if ((tmp_next == short_next) && (tmp_off == short_off)){
|
||||
// 予測済みのと一致するなら何もしない
|
||||
} else if ((short_next >= 0) && (short2_next < 0)){ // 予測と異なるけど、別のが空いてるなら、そっちに記録する
|
||||
//printf("far short2_off = %I64d, short2_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short2_next = tmp_next;
|
||||
short2_off = tmp_off;
|
||||
} else {
|
||||
if ((short_next >= 0) && (tmp_next == short2_next) && (tmp_off == short2_off)){ // 既に予測済みのと一致するなら入れ替える
|
||||
short2_next = short_next;
|
||||
short2_off = short_off;
|
||||
//printf("exchange short2_off = %I64d, short2_next = %d\n", short2_off, short2_next);
|
||||
}
|
||||
//printf("far short_off = %I64d, short_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short_next = tmp_next;
|
||||
short_off = tmp_off;
|
||||
}
|
||||
} else if ((short_next < 0) &&
|
||||
(((__int64)block_size * (__int64)(tmp_next - files[num].b_off) == tmp_off) ||
|
||||
(tmp_off + s_blk[tmp_next].size == file_size))){
|
||||
// 検出ブロックが順当でなくても、末尾ブロックの開始位置や末端がファイル・サイズに一致すれば
|
||||
//printf("far short_off = %I64d, short_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short_next = tmp_next;
|
||||
short_off = tmp_off;
|
||||
} else if ((short2_next != tmp_next) || (short2_off != tmp_off)){
|
||||
//printf("far short2_off = %I64d, short2_next = %d, file = %d\n", tmp_off, tmp_next, num);
|
||||
short2_next = tmp_next;
|
||||
short2_off = tmp_off;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tiny_skip = 0; // 小さなファイルをブロック直後に一回だけ探す
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
#define FILE_VERSION "1.3.2.8" // ファイルのバージョン番号
|
||||
#define PRODUCT_VERSION "1.3.2" // 製品のバージョン番号
|
||||
#define FILE_VERSION "1.3.3.3" // ファイルのバージョン番号
|
||||
#define PRODUCT_VERSION "1.3.3" // 製品のバージョン番号
|
||||
|
||||
Reference in New Issue
Block a user