Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct 如何正确地将参数作为结构传递给NVRTC? let prog= “”//内核代码: 外部“C”{ #布拉格语包(1) 类型定义结构{ 整数长度; 浮点*指针; }全局数组浮点数; __全局无效内核主(全局数组浮点x){ printf(“(在设备上)x.length=%d\n”,x.length);//打印:(在设备上)x.length=10 printf(“(在设备上)x.pointer=%lld\n”,x.pointer);//打印:(在设备上)x.pointer=0 printf(“sizeof(global_array_float)=%d”,sizeof(global_array_float));//12个字节,与预期的一样 } ;}""" 打印fn“%s”程序 让cuda_kernel=编译_kernel prog“kernel_main” let test_启动器(str:CudaStream,内核:CudaKernel,x:CudaGlobalArray,o:CudaGlobalArray)= 设块大小=1 kernel.GridDimensions fillRandomUniformMatrix ctx.Str x 1.0f 0.0f;x 设a'=d2mtocuda数组a //printfn“%A”(getd2M A) 让o=d2M.create((rows,cols))//o在这里什么都不做,因为这是一个极简示例。 设o'=d2mtocudao数组 test_启动器(ctx.Str、cuda_内核、a',o') cuda_context.Synchronize() //printfn“%A”(getd2Mo)_Struct_F#_Cuda_Nvrtc - Fatal编程技术网

Struct 如何正确地将参数作为结构传递给NVRTC? let prog= “”//内核代码: 外部“C”{ #布拉格语包(1) 类型定义结构{ 整数长度; 浮点*指针; }全局数组浮点数; __全局无效内核主(全局数组浮点x){ printf(“(在设备上)x.length=%d\n”,x.length);//打印:(在设备上)x.length=10 printf(“(在设备上)x.pointer=%lld\n”,x.pointer);//打印:(在设备上)x.pointer=0 printf(“sizeof(global_array_float)=%d”,sizeof(global_array_float));//12个字节,与预期的一样 } ;}""" 打印fn“%s”程序 让cuda_kernel=编译_kernel prog“kernel_main” let test_启动器(str:CudaStream,内核:CudaKernel,x:CudaGlobalArray,o:CudaGlobalArray)= 设块大小=1 kernel.GridDimensions fillRandomUniformMatrix ctx.Str x 1.0f 0.0f;x 设a'=d2mtocuda数组a //printfn“%A”(getd2M A) 让o=d2M.create((rows,cols))//o在这里什么都不做,因为这是一个极简示例。 设o'=d2mtocudao数组 test_启动器(ctx.Str、cuda_内核、a',o') cuda_context.Synchronize() //printfn“%A”(getd2Mo)

Struct 如何正确地将参数作为结构传递给NVRTC? let prog= “”//内核代码: 外部“C”{ #布拉格语包(1) 类型定义结构{ 整数长度; 浮点*指针; }全局数组浮点数; __全局无效内核主(全局数组浮点x){ printf(“(在设备上)x.length=%d\n”,x.length);//打印:(在设备上)x.length=10 printf(“(在设备上)x.pointer=%lld\n”,x.pointer);//打印:(在设备上)x.pointer=0 printf(“sizeof(global_array_float)=%d”,sizeof(global_array_float));//12个字节,与预期的一样 } ;}""" 打印fn“%s”程序 让cuda_kernel=编译_kernel prog“kernel_main” let test_启动器(str:CudaStream,内核:CudaKernel,x:CudaGlobalArray,o:CudaGlobalArray)= 设块大小=1 kernel.GridDimensions fillRandomUniformMatrix ctx.Str x 1.0f 0.0f;x 设a'=d2mtocuda数组a //printfn“%A”(getd2M A) 让o=d2M.create((rows,cols))//o在这里什么都不做,因为这是一个极简示例。 设o'=d2mtocudao数组 test_启动器(ctx.Str、cuda_内核、a',o') cuda_context.Synchronize() //printfn“%A”(getd2Mo),struct,f#,cuda,nvrtc,Struct,F#,Cuda,Nvrtc,下面是我目前正在研究的一篇文章的摘录。我非常接近于拥有一个可以工作的Cuda C编译器的F#引号,但我不知道如何从主机端正确地将参数传递到函数中 尽管有pack pragma,NVRTC 7.5 Cuda编译器仍在进行一些其他优化,我不知道它是什么 因为我使用的是F#引号,所以我需要将参数作为单个结构传递,这样才能工作。如果我将函数从kernel\u main(global\u array\u float x)更改为kernel\u main(int x\u length,float*x\u p

下面是我目前正在研究的一篇文章的摘录。我非常接近于拥有一个可以工作的Cuda C编译器的F#引号,但我不知道如何从主机端正确地将参数传递到函数中

尽管有pack pragma,NVRTC 7.5 Cuda编译器仍在进行一些其他优化,我不知道它是什么

因为我使用的是F#引号,所以我需要将参数作为单个结构传递,这样才能工作。如果我将函数从
kernel\u main(global\u array\u float x)
更改为
kernel\u main(int x\u length,float*x\u pointer)
那么它就可以工作了,但我认为这不是报价系统预先给我的形式,我希望避免做额外的工作,使F更像C


知道我可以尝试什么吗?

我做了两个错误的假设

第一个错误是假设
让args:obj[]=[| x.length;x.pointer |]
整齐地放置在彼此相邻的堆栈上。实际上,这是两个不同的参数,第二个参数在上面这样传递时会丢失

可以通过创建自定义结构类型并重写如下表达式来修复它:
let args:obj[]=[| CudaLocalArray(x.length,x.pointer)|]

当我像上面那样重写它时发现的另一个错误假设是,使用
[]
并不意味着字段将打包在一起。相反,与C一样,pack是一个参数,因此需要像这样使用:
[]

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)