- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi có một chương trình scala jcuda rất đơn giản có thêm một mảng rất lớn. Mọi thứ biên dịch và chạy tốt cho đến khi tôi muốn sao chép hơn 4 byte từ thiết bị của mình sang máy chủ. Khi tôi cố gắng sao chép nhiều hơn 4 byte, tôi nhận được CUDA_ERROR_INVALID_VALUE.
// Điều này gây nôn và tạo ra CUDA_ERROR_INVALID_VALUE
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
8
)
// Cái này chạy tốt
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
4
)
Để hiểu rõ hơn về chương trình thực tế, đây là mã hạt nhân của tôi, nó biên dịch và chạy tốt:
bên ngoài "C"
__global__ void add(int n, int *a, int *b, int *sum) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
nếu (tôi<>
{
tổng[i] = a[i] + b[i];
}
}
Sau đó, tôi đã dịch một số mã ví dụ java sang mã scala của mình. Dù sao, đây là toàn bộ chương trình đang chạy:
góidev
nhập jcuda.driver.JCudaDriver._
nhập jcuda._
nhập jcuda.driver._
nhập jcuda.runtime._
/**
* Được tạo bởi nhà phát triển vào ngày 7/6/15.
*/
đối tượng TestCuda {
chắc chắn ban đầu = {
JCudaDriver.setExceptionsEnabled(true)
//Vectơ đầu vào
// Vectơ đầu ra
// Tải mô-đun
// Tải file ptx.
val kernelPath = "/home/dev/IdeaProjects/jniopencl/src/main/resources/kernels/JCudaVectorAddKernel30.cubin"
cuInit(0)
thiết bị val = thiết bị CU mới
cuDeviceGet(thiết bị, 0)
bối cảnh val = CUcontext mới
cuCtxCreate(ngữ cảnh, 0, thiết bị)
//Tạo và tải mô-đun
mô-đun val = CUmodule mới()
cuModuleLoad(mô-đun, kernelPath)
// Lấy con trỏ hàm tới hàm kernel.
var add = newCUfunction()
cuModuleGetFunction(thêm, mô-đun, "thêm")
val numElements = 100000
val HostInputA = 1 đến numElements toArray
val HostInputB = 1 tới numElements toArray
giá trị SI: Int = Sizeof.INT.asInstanceOf[Int]
// Cấp phát dữ liệu đầu vào của thiết bị và sao chép
// máy chủ nhập dữ liệu vào thiết bị
var deviceInputA = CUdeviceptr mới
cuMemAlloc(deviceInputA, numElements *SI)
cuMemcpyHtoD(
thiết bịInputA,
Con trỏ.to(hostInputA),
numElements*SI
)
var deviceInputB = CUdeviceptr mới
cuMemAlloc(deviceInputB, numElements *SI)
cuMemcpyHtoD(
thiết bịInputB,
Con trỏ.to(hostInputB),
numElements*SI
)
// Cấp phát bộ nhớ đầu ra của thiết bị
val deviceOutput = new CUdeviceptr()
cuMemAlloc(deviceOutput, SI)
// Thiết lập tham số kernel: Con trỏ tới một mảng
// của các con trỏ trỏ tới giá trị thực tế.
val kernelParameters = Pointer.to(
Pointer.to(Array[Int](numElements)),
Con trỏ.to(deviceInputA),
Con trỏ.to(deviceInputB),
Con trỏ.to(deviceOutput)
)
// Gọi hàm kernel
khối valSizeX = 256
val GridSizeX = Math.ceil(numElements / blockSizeX).asInstanceOf[Int]
cuLaunchKernel(
thêm vào,
lướiSizeX, 1, 1,
khốiSizeX, 1, 1,
0, vô giá trị,
kernelParameter, null
)
cuCtxĐồng bộ hóa
// **** Code phát điên ở đây với lỗi đó
// Nếu tôi nhận xét điều này thì chương trình sẽ chạy tốt
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
số phần tử
)
HostOutput.foreach(print(_))
}
}
Dù sao, tôi chỉ cho bạn biết thông số kỹ thuật của máy tính của tôi. Tôi đang chạy Ubuntu 14.04 trên thiết lập tối ưu với thẻ GTX 770M hỗ trợ Điện toán 3.0. Tôi vẫn đang chạy NVCC phiên bản 5.5. Cuối cùng, tôi đang sử dụng Java 8 chạy scala phiên bản 2.11.6. Tôi là người mới và mọi trợ giúp đều được đánh giá cao.
câu trả lời hay nhất
đây
val deviceOutput = new CUdeviceptr()
cuMemAlloc(deviceOutput, SI)
bạn đang phân công SI
Byte - tức là 4 byte, bằng kích thước của int. Việc ghi nhiều hơn 4 byte vào con trỏ thiết bị này có thể khiến mọi thứ trở nên khó hiểu. nên
cuMemAlloc(deviceOutput, SI * numElements)
Một lần nữa, tôi nghĩ cách gọi được đề cập nên là
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
numElements*SI
)
(Lưu ý tham số cuối cùng *SI
).
Về java - cuMemcpyDtoH tạo CUDA_ERROR_INVALID_VALUE, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30797257/
我有一个非常简单的 scala jcuda 程序,它添加了一个非常大的数组。一切都编译和运行得很好,直到我想从我的设备复制超过 4 个字节到主机。当我尝试复制超过 4 个字节时,我收到 CUDA_ER
Tôi đang cố chạy mã dựa trên liên kết sau https://documen.tician.de/pycuda/tutorial.html Chạy mã trong liên kết này hoạt động tốt. Đây là phiên bản của tôi, với định nghĩa tương tự. Xin lưu ý rằng tôi đang trích dẫn
Tôi là một lập trình viên xuất sắc, rất giỏi!