0

我正在尝试使用 VS2013 在 VB.NET 中使用 CUDAFy 1.29。

我正在尝试从 CUDAFy 翻译 C# 的示例,我遇到了两种类型的错误,如下所述:

我的变量

Shared cs_CC As String = "adiciona"
Shared MyGPU As GPGPU = Nothing
Shared Arch As eArchitecture = Nothing

我的代码:

 Shared Executa()

 if Loader = true

        Dim Modulo = CudafyModule.TryDeserialize(cs_cc)
        If IsNothing(Modulo) OrElse (Not Modulo.TryVerifyChecksums) Then
            Modulo = CudafyTranslator.Cudafy(ePlatform.All, Arch, cs_CC.GetType)
            Modulo.Serialize()
        End If

        MyGPU.Loadmodule(Modulo)

        Dim a As Integer() = New Integer(N - 1) {}
        Dim b As Integer() = New Integer(N - 1) {}
        Dim c As Integer() = New Integer(N - 1) {}

        ' allocate the memory on the GPU
        Dim dev_a As Integer() = MyGPU.Allocate(Of Integer)(a)
        Dim dev_b As Integer() = MyGPU.Allocate(Of Integer)(b)
        Dim dev_c As Integer() = MyGPU.Allocate(Of Integer)(c)

        ' fill the arrays 'a' and 'b' on the CPU
        For i As Integer = 0 To N - 1
            a(i) = i
            b(i) = 2 * i
        Next

        ' copy the arrays 'a' and 'b' to the GPU
        MyGPU.CopyToDevice(a, dev_a)
        MyGPU.CopyToDevice(b, dev_b)


        For i As Integer = 0 To 128
            MyGPU.Launch(1, 1).adiciona(dev_a, dev_b, dev_c)
        Next

 end if

结束子

将在 CUDA 上运行的函数 ADICIONA

 <Cudafy()> _
  Shared Sub adiciona(thread As GThread, a As Integer(), b As Integer(), c As Integer())

    Dim tid As Integer = thread.blockIdx.x
    While tid < N
        c(tid) = a(tid) + b(tid)
        tid += thread.gridDim.x
    End While
   End Sub

LOADER:尝试识别卡和CUDA(成功运行):

Public Shared Function Loader() As Boolean

    DeviceType = eGPUType.Cuda
    CudafyModes.Target = DeviceType
    CudafyTranslator.Language = If(CudafyModes.Target = eGPUType.Cuda, eLanguage.Cuda, eLanguage.OpenCL)
    Dim CompatibleDevice As GPGPUProperties() = CudafyHost.GetDeviceProperties(CudafyModes.Target, True).ToArray

    If Not CompatibleDevice.Any Then        '  não possui um full-CUDA device
        MsgBox("I do not found any OpenCL or CUDA compatible device")
        Return False
    End If

    Dim selectedDevice As GPGPUProperties = CompatibleDevice(0)
    If IsNothing(selectedDevice) Then
        MsgBox("I cannot allocate a compatible device")
        Return False
    End If


    CudafyModes.DeviceId = selectedDevice.DeviceId
    Thread_per_Block = selectedDevice.MaxThreadsPerBlock
    Blocks_per_Grid = selectedDevice.MaxThreadsSize.x
    Shared_Mem_per_Block = selectedDevice.SharedMemoryPerBlock

    MyGPU = CudafyHost.GetDevice(CudafyModes.Target, CudafyModes.DeviceId)
    Arch = MyGPU.GetArchitecture

    Return True

 End Function

问题:

问题 1:如果我只使用dim Modulo 作为 CudafyModule = CudafyTranslator.Cudafy()我收到以下错误:不支持检查语句。有点奇怪!Cudafy 的所有文档都显示了这一行!

问题 2:因此,我尝试检查写入模块 (.CDFY) 是否存在,如果不存在,则调用 Serialize() 函数。问题是该函数在我的文件夹中创建了一个名为STRING.CDFY的文件,但不是ADICIONA.CDFY也不是ADD_LONG_LOOP.CDFY,这是正确的。由于我想避免在每次运行此代码时进行编译,如何正确地使 CUDAFy 编写它?

问题 3:当 VS 运行时,一切正常,直到调用 ADICIONA (MyGPU.Launch)!VS 停止执行,并显示一条消息“无法在模块中找到函数 'ADICIONA' ”。

有趣的是:

1- 创建临时文件(.CU、.PTX)和 .CDFY 文件。它证明 NVCC 编译器运行良好并创建了 CUDA 模块。那么,为什么代码没有找到函数 ADICIONA?

2- 用 C# 编写的所有示例都 100% 在这里运行。并且从 C# 和 VB 的转换似乎没问题(我曾使用 TELERIK 来做)。我不认为问题可能与此有关,但我可能是错的。

3-问题与 NVCC 编译器或对 VB.NET 的某些引用无关,因为代码可以编译。

我试图用 CODEPLEX 写一个答案。根本没有答案...我试图在 Internet 上查看很多示例,但所有这些示例都是为 CUDAFy C# 创建的,并且没有一个使用版本 1.29 和 CUDA 7.5。

另外,我想了解为什么基本函数 (CudafyTranslator.Cudafy()) 在 VB 中出错,但在 C# 中没有。

那么,这里有没有人使用 VB.NET 成功创建了 CUDAFy 代码?

非常感谢您的帮助。

4

2 回答 2

0

试试这个简单的例子:

Imports Cudafy
Imports Cudafy.Host
Imports Cudafy.Translator

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim GPU As GPGPU = CudafyHost.GetDevice(eGPUType.OpenCL, CudafyModes.DeviceId)
        Dim Modulo As CudafyModule = CudafyTranslator.Cudafy(ePlatform.All, GPU.GetArchitecture())

        GPU.LoadModule(Modulo)

        Dim Resultado As Integer
        Dim ResultadoGPU As Integer() = gpu.Allocate(Of Integer)()

        GPU.Launch().Adicionar(2, 7, ResultadoGPU)
        GPU.CopyFromDevice(ResultadoGPU, Resultado)
        MessageBox.Show("2 + 7 = " & Resultado)

        GPU.Launch().Subtrair(2, 7, ResultadoGPU)
        GPU.CopyFromDevice(ResultadoGPU, Resultado)
        MessageBox.Show("2 - 7 = " & Resultado)

        GPU.Free(ResultadoGPU)
    End Sub

    <Cudafy()>
    Private Shared Sub Adicionar(a As Integer, b As Integer, c As Integer())
        c(0) = a + b
    End Sub

    <Cudafy()>
    Private Shared Sub Subtrair(a As Integer, b As Integer, c As Integer())
        c(0) = a - b
    End Sub
End Class
于 2020-11-02T21:46:09.423 回答
0

要解决问题 1,请选中项目属性 > 编译 > 高级编译选项 > 优化下的“删除整数溢出检查”。更多信息:http ://forums.asp.net/post/715302.aspx

于 2016-03-24T20:00:55.833 回答