문제

C# 배열의 서브 세트를 가져 와서 원래 배열을 수정하지 않고 다른 코드의 피시로 전달하는 효율적인 방법이 있습니까? GPU에 배열을 복사하는 함수가있는 cuda.net을 사용합니다. 예를 들어 배열의 10 번째 기능을 전달하고 배열의 각 10 분의 1을 GPU (파이프 라인 목적으로) 별도로 복사하고 싶습니다.

이러한 방식으로 배열을 복사하는 것은 한 번에 복사하는 것만 큼 효율적이어야합니다. 안전하지 않은 코드로 수행 할 수 있으며 적절한 메모리 위치를 참조 할 수 있지만 그 외에는 확실하지 않습니다. Copyto 함수는 전체 배열을 다른 배열로 복사하므로 유용하지 않은 것처럼 보입니다.

도움이 되었습니까?

해결책

좋아, 나는 전에 그 질문을 오해했다.

당신이 원하는 것은 System.Buffer.BlockCopy 또는 System.array.copy.

LINQ 방식은 끔찍하게 비효율적입니다. 복사하는 버퍼를 재사용 할 수 있다면 효율성에도 도움이됩니다. 매번 새 배열을 만드는 것을 피하십시오. 상단 위로 복사하십시오. 그래도 "큰"배열을 똑같이 나눌 수 없다면 마지막 경우에는 새로운 배열이 필요합니다.

다른 팁

이것이 얼마나 효율적인지 잘 모르겠지만 ...

int[] myInts = new int[100];

//Code to populate original arrray

for (int i = 0; i < myInts.Length; i += 10)
{
    int[] newarray = myInts.Skip(i).Take(10).ToArray();
    //Do stuff with new array
}

바이트 배열에서 관리되지 않는 포인터로 이동 해야하는 경우 Marshal.copy를 사용해 볼 수 있습니다. 안전하지 않은 코드를 직접 생성하는 것을 피합니다.

편집 : API를 상환하는 경우에만 분명히 작동합니다. 죄송합니다 - 오해. 효율적인 서브 어레이 방법을 원합니다.

그것은 당신이 정말로 원하는 것이 형식의 원래 클래스에서 API라는 것을 놀라게합니다.

void CopyToGpu(byte[] source, int start, int length);

연장 방법을 사용하고 수율 수익률을 사용할 수 있습니다.

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top