let prog =
"""//Kernel code:
extern "C" {
#pragma pack(1)
typedef struct {
int length;
float *pointer;
} global_array_float;
__global__ void kernel_main(global_array_float x){
printf("(on device) x.length=%d\n",x.length); // prints: (on device) x.length=10
printf("(on device) x.pointer=%lld\n",x.pointer); // prints: (on device) x.pointer=0
printf("sizeof(global_array_float)=%d", sizeof(global_array_float)); // 12 bytes just as expected
}
;}"""
printfn "%s" prog
let cuda_kernel = compile_kernel prog "kernel_main"
let test_launcher(str: CudaStream, kernel: CudaKernel, x: CudaGlobalArray<float32>, o: CudaGlobalArray<float32>) =
let block_size = 1
kernel.GridDimensions <- dim3(1)
kernel.BlockDimensions <- dim3(block_size)
printfn "(on host) x.length=%i" x.length // prints: (on host) x.length=10
printfn "(on host) x.pointer=%i" x.pointer // prints: (on host) x.pointer=21535919104
let args: obj [] = [|x.length;x.pointer|]
kernel.RunAsync(str.Stream, args)
let cols, rows = 10, 1
let a = d2M.create((rows,cols))
|> fun x -> fillRandomUniformMatrix ctx.Str x 1.0f 0.0f; x
let a' = d2MtoCudaArray a
//printfn "%A" (getd2M a)
let o = d2M.create((rows,cols)) // o does nothing here as this is a minimalist example.
let o' = d2MtoCudaArray o
test_launcher(ctx.Str,cuda_kernel,a',o')
cuda_context.Synchronize()
//printfn "%A" (getd2M o)这是我目前正在开发的main repo的一段摘录。我非常接近拥有一个对Cuda C编译器的F#引用,但是我不知道如何从主机端将参数正确地传递到函数中。
尽管有包编译指示,NVRTC7.5CUDA编译器正在做一些其他的优化,我不知道它是什么。
因为我正在处理F#引用,所以我需要将参数作为单个结构传递,这样才能正常工作。如果我将函数从kernel_main(global_array_float x)改为类似于kernel_main(int x_length, float *x_pointer)的形式,那么它就可以工作了,但这不是报价系统预先提供给我的形式,我希望避免做额外的工作来使F#更像C。
你知道我可以试试什么吗?
发布于 2016-11-05 00:17:59
我做了两个错误的假设。
第一个错误是假设let args: obj [] = [|x.length;x.pointer|]将被整齐地放置在堆栈中。实际上,这是两个不同的参数,第二个参数在传递时会丢失,就像上面提到的。
可以通过创建自定义结构类型并重写表达式来修复它,如下所示:let args: obj [] = [|CudaLocalArray(x.length,x.pointer)|]。
当我像上面那样重写它时,我发现的另一个错误假设是,使用[<StructLayout(LayoutKind.Sequential>]并不意味着字段将被打包在一起。相反,像C一样,pack是一个参数,所以它需要像这样使用:[<StructLayout(LayoutKind.Sequential,Pack=1)>]。
https://stackoverflow.com/questions/40423722
复制相似问题