/*
	cuda implementation of RecPF algorithm based on matlab function version

	[U,Out] = RecPF(m,n,aTV,aL1,picks,B,TVtype,opts,PsiT,Psi,URange,uOrg) - deklaracja funkcji w Matlabie

	poniej przykadowe wywoanie funkcji RecPF w matlabie ze skryptu sart_tv
	[UU,Out_RecPF] = RecPF(nn,nn,aTV,aL1,picks,B,2,opts,PsiT,Psi,range(U(:)),U);

	U - macierz
	U(:) - wektor, dodaje kolejno kolumny macierzy U
	range - dla wektora, zwraca rnice midzy najbardziej skrajnymi wartociami (najmniejsz i najwiksz)
			innymi sowy, zwraca najwiksz rnic midzy dowolnymi dwoma elementami

	opis parametrw:
	czy parametr jest skalarem, wektorem, macierz, typ danych itp.

	m - nn - warto typu int
	n - nn - warto typu int
	aTV - staa double 
	aL1 - staa double
	picks - wektor zawierajcy indeksy, patrz: picks = find(abs(FB)>thresh);
	B - B = FB(picks); - tworzy wektor B z wartociami z macierzy FB odpowiadajcymi indeksom picks
	TVtype -- 2 (isotropic) or 1 (anisotropic) (w przykadzie warto 2)
	opts
	Psit - chyba funkcja
	Psi - chyba funkcja
	URange  - range(U(:))
	uOrg -- (optional) true image - macierz

	-----w sart_tv: ----------
	fb = FB(:);
	U = reshape(xx,nn,nn); 
    FB = fft2(U)/nn;%sqrt(n);
	thresh = var(abs(fb))*median(abs(fb(2:end)))*max(10+k,10+K);%(K-k+1);
    picks = find(abs(FB)>thresh);
	B = FB(picks);
	----------------------------

	tresh - ta warto jest obliczana w sposb do skomplikowany
	
	picks, B oraz U, ktre s argumentami w wywoaniu RecPF
	B = FB(picks); - tworzy wektor B z wartociami z macierzy FB odpowiadajcymi indeksom picks
*/

/*
algorytm do obliczania Denom2 = abs(psf2otf([prd,-prd],[m,n])).^2 + abs(psf2otf([prd;-prd],[m,n])).^2; 

abs(psf2otf([prd,-prd],[m,n])).^2 = abs(fft([prd,-prd], n)).^2 (gdzie fft daje tylko wiersz, ktry naley powieli)
abs(psf2otf([prd;-prd],[m,n])).^2 = abs(fft([prd;-prd], m)).^2 (gdzie fft daje tylko kolumn, ktr naley powieli)

*/



	.file	"tmpxft_0029b622_00000000-6_RecPF_parameters.cudafe1.cpp"
	.text
#APP

#NO_APP
	.type	_ZL26__cudaUnregisterBinaryUtilv, @function
_ZL26__cudaUnregisterBinaryUtilv:
.LFB2010:
	.cfi_startproc
	endbr64
	movq	_ZL20__cudaFatCubinHandle(%rip), %rdi
	jmp	__cudaUnregisterFatBinary@PLT
	.cfi_endproc
.LFE2010:
	.size	_ZL26__cudaUnregisterBinaryUtilv, .-_ZL26__cudaUnregisterBinaryUtilv
	.section	.text.startup,"ax",@progbits
	.type	_ZL24__sti____cudaRegisterAllv, @function
_ZL24__sti____cudaRegisterAllv:
.LFB2033:
	.cfi_startproc
	endbr64
	pushq	%rax
	.cfi_def_cfa_offset 16
	leaq	_ZL15__fatDeviceText(%rip), %rdi
	call	__cudaRegisterFatBinary@PLT
	movq	%rax, %rdi
	movq	%rax, _ZL20__cudaFatCubinHandle(%rip)
	call	__cudaRegisterFatBinaryEnd@PLT
	leaq	_ZL26__cudaUnregisterBinaryUtilv(%rip), %rdi
	popq	%rdx
	.cfi_def_cfa_offset 8
	jmp	atexit@PLT
	.cfi_endproc
.LFE2033:
	.size	_ZL24__sti____cudaRegisterAllv, .-_ZL24__sti____cudaRegisterAllv
	.section	.init_array,"aw"
	.align 8
	.quad	_ZL24__sti____cudaRegisterAllv
	.section	.nvFatBinSegment,"aw"
	.align 8
	.type	_ZL15__fatDeviceText, @object
	.size	_ZL15__fatDeviceText, 24
_ZL15__fatDeviceText:
	.long	1180844977
	.long	1
	.quad	fatbinData
	.quad	0
	.local	_ZL20__cudaFatCubinHandle
	.comm	_ZL20__cudaFatCubinHandle,8,8
	.ident	"GCC: (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:


#include <hip/hip_runtime.h>
/*
	cuda implementation of RecPF algorithm based on matlab function version

	[U,Out] = RecPF(m,n,aTV,aL1,picks,B,TVtype,opts,PsiT,Psi,URange,uOrg) - deklaracja funkcji w Matlabie

	poniej przykadowe wywoanie funkcji RecPF w matlabie ze skryptu sart_tv
	[UU,Out_RecPF] = RecPF(nn,nn,aTV,aL1,picks,B,2,opts,PsiT,Psi,range(U(:)),U);

	U - macierz
	U(:) - wektor, dodaje kolejno kolumny macierzy U
	range - dla wektora, zwraca rnice midzy najbardziej skrajnymi wartociami (najmniejsz i najwiksz)
			innymi sowy, zwraca najwiksz rnic midzy dowolnymi dwoma elementami

	opis parametrw:
	czy parametr jest skalarem, wektorem, macierz, typ danych itp.

	m - nn - warto typu int
	n - nn - warto typu int
	aTV - staa double 
	aL1 - staa double
	picks - wektor zawierajcy indeksy, patrz: picks = find(abs(FB)>thresh);
	B - B = FB(picks); - tworzy wektor B z wartociami z macierzy FB odpowiadajcymi indeksom picks
	TVtype -- 2 (isotropic) or 1 (anisotropic) (w przykadzie warto 2)
	opts
	Psit - chyba funkcja
	Psi - chyba funkcja
	URange  - range(U(:))
	uOrg -- (optional) true image - macierz

	-----w sart_tv: ----------
	fb = FB(:);
	U = reshape(xx,nn,nn); 
    FB = fft2(U)/nn;%sqrt(n);
	thresh = var(abs(fb))*median(abs(fb(2:end)))*max(10+k,10+K);%(K-k+1);
    picks = find(abs(FB)>thresh);
	B = FB(picks);
	----------------------------

	tresh - ta warto jest obliczana w sposb do skomplikowany
	
	picks, B oraz U, ktre s argumentami w wywoaniu RecPF
	B = FB(picks); - tworzy wektor B z wartociami z macierzy FB odpowiadajcymi indeksom picks
*/

/*
algorytm do obliczania Denom2 = abs(psf2otf([prd,-prd],[m,n])).^2 + abs(psf2otf([prd;-prd],[m,n])).^2; 

abs(psf2otf([prd,-prd],[m,n])).^2 = abs(fft([prd,-prd], n)).^2 (gdzie fft daje tylko wiersz, ktry naley powieli)
abs(psf2otf([prd;-prd],[m,n])).^2 = abs(fft([prd;-prd], m)).^2 (gdzie fft daje tylko kolumn, ktr naley powieli)

*/



	.text
	.file	"RecPF_parameters.hip"
	.type	__hip_cuid_,@object             # @__hip_cuid_
	.bss
	.globl	__hip_cuid_
__hip_cuid_:
	.byte	0                               # 0x0
	.size	__hip_cuid_, 1

	.ident	"AMD clang version 18.0.0git (https://github.com/RadeonOpenCompute/llvm-project roc-6.3.2 25012 e5bf7e55c91490b07c49d8960fa7983d864936c4)"
	.section	".note.GNU-stack","",@progbits
	.addrsig
	.addrsig_sym __hip_cuid_

	.text
	.p2alignl 7, 3214868480
	.fill 96, 4, 3214868480
	.type	__hip_cuid_,@object             ; @__hip_cuid_
	.section	.bss,"aw",@nobits
	.globl	__hip_cuid_
__hip_cuid_:
	.byte	0                               ; 0x0
	.size	__hip_cuid_, 1

	.ident	"AMD clang version 18.0.0git (https://github.com/RadeonOpenCompute/llvm-project roc-6.3.2 25012 e5bf7e55c91490b07c49d8960fa7983d864936c4)"
	.section	".note.GNU-stack","",@progbits
	.addrsig
	.addrsig_sym __hip_cuid_
	.amdgcn_target "amdgcn-amd-amdhsa--gfx1100"
	.amdgpu_metadata
---
amdhsa.kernels:  []
amdhsa.target:   amdgcn-amd-amdhsa--gfx1100
amdhsa.version:
  - 1
  - 2
...

	.end_amdgpu_metadata
